Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Макросы.doc
Скачиваний:
28
Добавлен:
21.11.2018
Размер:
16.91 Mб
Скачать

Централизованный обработчик ошибок

Вместо того чтобы включать обработчик ошибок в каждую процедуру, можно создать централизованный обработчик ошибок - отдельную функцию, которая будет перехватывать ошибки, а затем, основываясь на номере ошибки, выполнять те или иные действия. Но все равно каждая процедура, в которой предусмотрена обработка ошибок, будет иметь оператор On Error. При возникновении ошибки этот оператор обращается к процедуре обработки ошибок, для которой функция-централизованный обработчик ошибок возвращает число, определяемое типом ошибки. Затем с помощью оператора Select Case выбирается оператор, осуществляющий выход из обработчика ошибок. Возможны следующие операторы выхода. (Оператор Resume описан выше.)

  • Оператор Resume.

  • Оператор Resume Next.

  • Оператор Resume метка.

  • Оператор Exit - выход из процедуры.

  • Оператор End - завершение приложения.

Обычно в локальную процедуру обработки ошибки функция-централизованный обработчик возвращает целое значение из интервала от 1 до 5 (как показано ниже), но это не правило, и вы можете создать свой централизованный обработчик, который будет более дифференцированно различать типы ошибок.

Опишем процесс создания централизованного обработчика ошибок.

  1. Добавьте новый модуль в рабочую книгу и создайте функцию с именем HandleErrors.

  2. Функция HandleErrors имеет следующий код:

Function HandleErrors(iErrNum) As Integer

 Select Case iAction

 Case 5

  'Неправильный вызов процедуры

  MsgBox Error(iErrNum) & "Обратитесь к справке"

  iAction =2

 Case 7

  'He хватает оперативной памяти

  MsgBox "Закройте все неиспользуемые приложения"

  iAction = 1

 Case 11

  'Деление на ноль

  MsgBox "Деление на ноль. Введите другое значение"

  iAction = 1

 Case 48,49,51

  'Ошибка загрузки библиотек DLL

  MsgBox iErrNum & "Обратитесь к справке"

  iAction = 5

 Case 57

  'Ошибка ввода-вывода

  MsgBox "Вставьте дискету в дисковод А:"

  iAction = 1

 Case Else

  MsgBox "Неопознанная ошибка"

  iAction = 5

 End Select

 ErrorHandle = iAction

End Function

  1. Перейдите в процедуру ПримерОбработчик (она находится в другом модуле).

  2. Приведите код этой процедуры к следующему виду (изменения в коде выделены полужирным шрифтом):

Public Sub ПримерОбработчик()

 Dim sngValue As Single, sngDivideBy As Single

 Dim sngAnswer As Single

 Dim iResponse As Integer

 On Error GoTo ErrorZone

 sngValue = InputBox("Введите делимое")

 sngDivideBy = InputBox("Введите делитель")

 sngAnswer = sngValue / sngDivideBy

 MsgBox "Результат деления = " & sngAnswer

 Exit Sub

 ErrorZone:

  'Оператор Select использует значения,

  'возвращаемые функцией HandleErrors

  Select Case HandleErrors(Err)

  Case 1

   Resume

  Case 2

   Resume Next

  'В этой процедуре не рассматривается

  'Case 3, передающий управление в тело процедуры

  Case 4

   Exit Sub

  Case 5

   End

  End Select

End Sub

  1. Выполните процедуру.

  2. Введите 8 в первое окно ввода.

  3. Введите 0 во второе окно ввода. Это приведет к ошибке.

  4. Щелкните на кнопке ОК для закрытия окна сообщения.

Как видите, функция централизованного обработчика имеет разветвляющуюся структуру, что позволяет затем в локальной процедуре обработки ошибок применять операторы Resume, Resume Next и другие необходимые операторы. Я рекомендую наряду с этими операторами использовать окна сообщений, которые выводили бы достаточно полную информацию о возникших ошибках.

Вы можете использовать созданную здесь функцию централизованного обработчика ошибок в своих дальнейших разработках, скопировав и вставив ее в создаваемое приложение.

Резюме

Процесс отладки, рассмотренный нами в предыдущем часе, может найти и устранить те ошибки, которые локализованы в самом коде приложения, будь то синтаксические или логические ошибки. Но реальный процесс выполнения приложения на реальном компьютере также может привести к ошибкам выполнения, которые трудно заранее предусмотреть. В этом случае применяется процедуры обработки ошибок. Приложения, имеющие такие процедуры, устойчивы к ошибкам и работают стабильно. Если приложение состоит из нескольких процедур, то целесообразно создать централизованный обработчик ошибок.