Шаг 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 можно вызывать из разных мест и всегда будет произведена одна и та же обработка ошибок. Таким образом удобнее поддерживать процедуры обработки, так как они централизованные.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: