www.ПЕРВЫЕ ШАГИ.ru :: Шаг 63 - Обработка ошибок в VBA

VBA

Шаг 63 - Обработка ошибок в VBA

Обрабатывать ошибки можно тремя способами:

  1. Строчная обработка
  2. Создание локального обработчика
  3. Создание глобального обработчика

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


Предыдущий Шаг | Следующий Шаг
Автор Каев Артем.