Было бы хорошо сделать вид, что программа Access всегда успешно справляется с вашим программным кодом без малейшей заминки. Но следует признать, что ошибки все же
возникают и случается это часто. Этот факт не должен пугать вас. В конце концов, одна из причин применения кода на языке Visual Basic вместо обычных макросов состоит в том, что вы можете с изяществом выявлять ошибки и реагировать на них.
Вы столкнетесь с двумя типами ошибок в вашем коде.
■ Ошибки. Это ошибки кодирования, которые вы вносите случайно. Обычно они обнаруживаются при тестировании вашей БД. (Если повезет, редактор Visual Basic заметит ошибку, как только вы введете ее, и затем выведет соответствующее предупреждающее сообщение.)
■ Непредвиденные ограничения. Эти ошибки возникают в определенных обстоятельствах, которые вы возможно не предусмотрели. Скажем, вы создаете две формы: Order и Order_Subform. Форма Order_Subform проектировалась для применения в качестве подчиненной формы в форме Order и содержит программный код, который обращается к элементам управления на форме Order. Если же кто-либо откроет непосредственно форму Order_Subform, форма Order окажется недоступной и этот программный код завершится аварийно.
Ваша задача, как добросовестного программиста, исправить все ошибки и обработать непредвиденные ограничения наилучшим образом. Для выхода из затруднений Visual Basic предлагает два средства. Можно использовать отладку для диагностики и устранения необычных проблем и код обработки ошибок для выявления неожиданных проблем и оповещения о них других пользователей.
Отладка
Отладка — это отличное средство, позволяющее пройтись по вашему коду, понаблюдать за его работой и заметить ошибки. Отладка программного кода аналогична отладке макроса в том смысле, что позволяет выполнить ваш алгоритм пошагово, оператор за оператором. Но у кода более мощное средство отладки, которое позволяет проверять сложные процедуры, циклы и условные операторы. Оно даже может показать, что в данный момент хранится в ваших переменных.
Подсказка
Настоящее преимущество отладки заключается в том, что она позволяет вам проверить ваши предположения. У каждого программиста есть собственные предположения о том, как работает фрагмент кода. Однако если код делает именно то, чего вы ждали, у вас, вероятнее всего, нет ошибок. С помощью отладки можно точно найти место, где код делает что-то неожиданное — когда вычисление дает странный результат, условный оператор отправляет неверным путем, цикл повторяется лишний раз и т. д. Затем можно исправить ошибку.
Самый легкий способ отладки — установка точек прерывания или останова, специального маркера, сообщающего программе Access о том, где вы хотите начать отладку. Когда Access достигает строки кода с точкой останова, программа приостанавливает выполнение кода. Затем она позволяет вам выполнять код с заданной вами скоростью, поочередно одну строку кода за другой.
Точки останова применяют следующим образом.
1. Найдите первую строку кода, которую хотите отладить.
Если нужно проверить подпрограмму целиком, начните с оператора Sub или Function. Если вы хотите проверить конкретную часть кода, перейдите к ней.
2. Щелкните слева кнопкой мыши для установки точки останова в этой строке (рис. 17.4). Каждая точка останова — это сигнал программе Access о месте начала отладки.
В некоторых строках кода нельзя поместить точки останова. Эти строки не содержат выполняемого кода, строки с пробелами, комментарии и объявления переменных. Все остальные строки — поле для игры по правилам.
Рис. 17.4. Все точки останова выглядят как кружки красного цвета. Удалить точку останова можно, щелкнув ее кнопкой мыши. В данном примере точка останова (обведена) помещается вначале функции ValidateCard
Примечание
Когда вы закроете вашу БД и откроете ее позже, все точки останова исчезнут.
3. Запустите ваш код.
Вы можете начать выполнять код обычным образом. Если вы отлаживаете обработчик события для нажатия кнопки, откройте соответствующую форму и затем щелкните кнопку мышью.
Когда программа Access достигнет точки останова, она приостановит выполнение и переключится в режим прерывания (break mode). Все в вашем приложении замрет.
В режиме прерывания у вас есть несколько вариантов.
Можно выполнять код пошагово. Это означает, что вы выполняете по одному оператору, останавливаясь после каждого из них. Для опробования нажмите клавишу <F8>. Это действие выполняет текущий оператор (который выделен желтой стрелкой), переходит к следующему выполняемому оператору и снова останавливается (рис. 17.5). Вы можете
продолжать, сколько захотите, нажимая клавишу <F8> для выполнения каждой строки кода.
Подсказка
Пошаговая отладка позволяет следить за работой кода. Если применить ее к функции ValidateCard, описанной ранее, вы увидите, как программа Access выполняет цикл несколько раз и как она переходит к разным секциям условного блока в зависимости от того, обрабатывается цифра в нечетной или четной позициях.
Рис. 17.5. В данном примере точка останова останавливает выполнение кода в начале функции ValidationCard. Затем пользователь, проводящий отладку, нажимает несколько раз клавишу <F8> для продвижения по коду. В данный момент код приостановлен в начале цикла For/Next (обведено)
Можно прекратить выполнение кода. Нажмите кнопку Stop (остановить) (она выглядит как квадрат) на панели инструментов редактора Visual Basic для завершения выполнения вашего кода.
Можно внести изменения. Если вы нашли ошибку, можно исправить ваш код и затем продолжить выполнение с внесенными изменениями. Конечно, существуют определенные типы корректировок, которые заставляют программу Access остановить отладку. Если вы внесли именно такое изменение, то увидите окно сообщения, предупреждающее о том, что "This action will reset your project" ("Это действие сбрасывает ваш проект"). Если щелкнуть мышью кнопку ОК, программа Access остановит выполнение вашего кода, как будто вы щелкнули мышью кнопку Stop (остановить) на панели инструментов редактора Visual Basic.
§ Можно просмотреть, что хранится в переменной. Для этого просто проведите указателем мыши поверх имени переменной где-нибудь в вашем коде (рис. 17.6).
Рис. 17.6. Проведя указателем мыши поверх имени переменной CurrentNumber, можно увидеть, что в данный момент она хранит число 4. Можно провести указателем мыши поверх имен переменных в любой строке кода, кроме текущей строки. Если применяется клавиша <F8> для пошагового прохода кода, можно следить за изменением значения по мере выполнения операций
■ Можно возобновить выполнение в нормальном режиме. Если вы обнаружили источник проблемы и не хотите продолжать отладку, просто нажмите клавишу <F5> (или щелкните мышью кнопку Play (выполнить) на панели инструментов редактора Visual Basic). Программа Access выполнит текущую строку и затем продолжит выполнение быстрым способом (по крайней мере, до встречи с очередной точкой останова).
Подсказка
Вы можете выполнить ловкий трюк с желтой стрелкой. Ее можно использовать для выполнения строк, расположенных в другом месте кода. Просто перетащите стрелку с нажатой кнопкой мыши к строке, которую хотите выполнить следующей, и затем нажмите клавишу <F5> для выхода из режима отладки и возобновления выполнения кода в обычном режиме.
У редактора Visual Basic есть множество других средств отладки. Однако точек останова вполне достаточно для начала исследования того, что делается под капотом, когда выполняется ваш код.
Обработка ошибок
Некоторые ошибки возникают не по вашей вине. Быть может, вы пытаетесь выполнить задачу с данными, которые получаете от кого-то, и эти данные некорректны. Представьте себе, что произойдет, если кто-нибудь вызовет функцию ValidateCard и передаст в нее номер кредитной карты, содержащий буквы и знаки пунктуации!
Несмотря на то, что такие ошибки могут произойти в результате чьей-то небрежности, именно вы должны обработать их наилучшим образом. Следует объяснить возникшую проблему с помощью понятного окна сообщения и закончить текущую задачу (или перейти к следующему шагу). Вы можете позаботиться об этом, добавив код обработки ошибок.
Подсказка
Лучше всего с помощью отладки найти и исправить все проблемы во фрагменте кода. После завершения этого процесса можно добавить код обработки ошибок, рассчитанный на непредвиденные проблемы. Если код обработки ошибок вставить раньше, отладить ваше приложение, возможно, будет немного труднее.
Обычно, когда программа Access обнаруживает ошибку, она переходит к коду, вызвавшему проблему, переключается в режим прерывания и отображает сообщение об ошибке. Такое поведение полезно, если вы планируете устранять проблему, но оно лишь травмирует обычных пользователей, которые, возможно, работают с вашей БД. Мало того, что они никогда раньше не видели программного кода, они окажутся в большой опасности, попытавшись исправить его, и создадут новые проблемы.
Вместо этого вам нужен способ обработки ошибки средствами программного кода. В языке Visual Basic есть специальный оператор, сообщающий программе Access о том, как поступать с ошибками. Это оператор On Error.
Оператор On Error предоставляет несколько вариантов. Можно заставить программу Access пропустить ошибки и попытаться выполнить очередную строку кода, например, следующим образом:
On Error Resume Next
Этот вариант почти всегда — не лучший выбор. Если ошибка возникла, за ней вероятнее всего последуют другие. В худшем случае такая ситуация может вынудить вашу программу делать вовсе не то, для чего она предназначена.
Можно также заставить программу Access перейти в конкретное место кода. Далее приведен пример.
On Error Goto ErrorHandlingCode
В данном примере программа Access переходит к разделу, названному ErrorHandlingCode, как только она обнаруживает какую-либо проблему. Вы должны обозначить этот раздел, указав в отдельной строке его имя и следом за ним вставив двоеточие (:), например, так:
ErrorHandlingCode:
' Если возникла ошибка, Access начинает выполнять ваш код с этой точки
Очень легко понять, как действует система обработки ошибок, если рассмотреть ее использование на примере функции ValidateCard:
Function ValidateCard(CardNumber As String)
On Error Goto ErrorHandlingCode
' Здесь расположен код, реализующий алгоритм Луна
Exit Function
ErrorHandlingCode:
MsgBox "Oops. Did your credit card number have letters?"
ValidateCard = False
End Function
Перечислим несколько важных деталей. Во-первых, оператор On Error помещается в cамом начале программного кода процедуры, поэтому вы можете обнаружить ошибки, возникшие в любом месте последующего кода. Во-вторых, обратите внимание на то, что после ого, как закончен код проверки номера, процедуру завершает оператор Exit Function. Этот оператор не дает программе Access попасть в следующий далее код обработки ошибок, если никакой ошибки не произошло. Наконец, код обработки ошибок выводит окно сообщения, в котором сообщается о нарушении естественного хода событий и возвращается результат, ясно обозначающий проблему. Чаще всего разработчики именно так обрабатывают ошибки. Только помните об обязательном использовании оператора Exit Sub или Exit Function, чтобы избежать случайного выполнения кода обработки ошибок.
Примечание
Как было указано ранее, пользователь, применяющий форму AddCreditCard, может получить два типа сообщений об ошибке — одно, объясняющее проблему, связанную с включением в номер карты букв и знаков пунктуации, и второе, констатирующее очевидный факт недопустимости номера. Если это сообщение кажется ненужным наказанием, вы можете перенести код обработки ошибок из функции ValidateCard в обработчик события При обновлении (On Update), с которым он на самом деле связан. В этом случае в обработчике события При обновлении (On Update) можно выбрать точный способ решения проблемы. Для того чтобы увидеть преобразованный код, посмотрите загружаемые из Интернета примеры к данной главе.
У вас есть еще только один вариант обработки ошибок. Можно заставить программу Access немедленно остановить выполнение и перейти в режим отладки с помощью следующего оператора:
On Error Goto 0
Конечно, такое поведение уже стало стандартным при обработке ошибок. Указанный оператор следует применять только, если вы переключаетесь многократно между разными методами обработки ошибок в одной и той же процедуре.