Шаг 63 - Обработка ошибок в VBA
Обрабатывать ошибки можно тремя способами:
- Строчная обработка
- Создание локального обработчика
- Создание глобального обработчика
Для строчной обработки ошибок применяется функция On Error Resume Next, при использовании этой функции выполнение работы программы не прерывается. В этот момент в объект Err помешается код ошибки, который можно выяснить через свойство Number. После обработки ошибки его необходимо очистить, воспользовавшись методом clear:
Sub Test() On Error Resume Next Open "c:\nullfile.nul" For Input As #1 Select Case Err.Number Case 53: MsgBox "Not file" Case 55: MsgBox "Not access" End Select Err.Clear End Sub
Строчный обработчик можно отключить.
On Error Goto 0
Локальный обработчик специфичен для конкретной процедуры. То есть для каждой процедуры вы создаете свой обработчик ошибок. Общий вид такой:
On Error Goto ErrorHandle код Exit Sub ErrorHandle: Код обработки ошибки End Sub
Обратите внимание на Exit Sub, который предназначен для выхода из процедуры. Если этого не сделать, то код предназначенный для обработки ошибок все равно выполнится, а это недопустимо. После обработки ошибки вы должны возобновить работу программы. Есть три способа:
- Повтор выполнения строки - Resume
- Выполнение следующей строки - Resume Next
- Закрытие формы - Unload Me
При отсутствии обработчика ошибок будет произведен поиск обработчика в вызывающей процедуре, если там его нет, то дальше по цепочке вызовов. Но при этом возобновление выполнения команд будет довольно сложным. Так как Resume, Resume Next будет работать в зависимости от того в какой процедуре оказалась ошибка.
Sub ErrorTest() On Error GoTo Error: Call Test Error: Select Case Err.Number Case 53: MsgBox "Not file" Case 55: MsgBox "Not access" End Select Err.Clear End Sub Sub Test() Open "c:\nullfile.nul" For Input As #1 End Sub
Централизованная обработка ошибок необходима, если ошибки могут возникнуть в разных местах, а обрабатывать лучше в одном. Например, во многих местах программы производится создание файлов. Идея заключается в том, что создание файла всегда производится в одной процедуре где и проводится обработка ошибок.
Sub ErrorTest() Call Test End Sub Sub Test() On Error GoTo Error: Open "c:\nullfile.nul" For Output As #1 Close #1 Exit Sub Error: MsgBox "error" Err.Clear End Sub
Так вот теперь процедуру Test можно вызывать из разных мест и всегда будет произведена одна и та же обработка ошибок. Таким образом удобнее поддерживать процедуры обработки, так как они централизованные.
Предыдущий Шаг | Следующий Шаг
Автор Каев Артем.