Обрабатывать ошибки можно тремя способами:
Строчная обработка
Создание локального обработчика
Создание глобального обработчика
Для строчной обработки ошибок применяется функция 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 можно вызывать из разных мест и всегда будет произведена одна и та же обработка ошибок. Таким образом удобнее поддерживать процедуры обработки, так как они централизованные.