Самоучитель VBA

Перехват и обработка ошибок


Из диалогового окна Microsoft Visual Basic видно, что каждая ошибка имеет свой код. В табл. 12.1 приведены коды наиболее часто встречаемых ошибок.

Таблица 12.1. Коды наиболее часто встречаемых ошибок

Код

Сообщение



5

Приложение не запущено

6

Переполнение

7

Не хватает памяти

9

Индекс выходит за пределы допустимого диапазона

11

Деление на нуль

13

Несоответствие типа

18

Произошло прерывание, вызванное пользователем

52

Неправильное имя файла или идентификатор

53

Файл не найден

54

Неверный режим работы с файлом

55

Файл уже открыт

56

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

61

Переполнение диска

68

Устройство недоступно

71

Диск не готов

72

Повреждена поверхность диска

335

Невозможен доступ к системным ресурсам

368

Истек срок действия данного файла. Программе требуется файл более новой версии

482

Ошибка принтера

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

Инструкция

On Error

Производит перехват ошибки. Устанавливает, что про грамма должна делать в случае появления ошибки.

Подпрограмма обработки ошибки

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

Синтаксис 1:

On Error GoTo строка

Активизирует подпрограмму обработки ошибок, начало которой определяется обязательным аргументом строка, значением которого может быть либо метка строки, либо номер строки.

Синтаксис 2:

On Error Resume Next

Указывает, что при возникновении ошибки происходит передача управления на инструкцию, непосредственно следующую за инструкцией, где возникла ошибка.

Синтаксис 3:

On Error GoTo 0

Отключает любой активизированный обработчик ошибок в текущей процедуре.

Инструкция

Resume

Обеспечивает процедуре возможность продолжить работу после обработки ошибки. Допустимы следующие синтаксисы.

Синтаксис 1:

Resume

После обработки ошибки управление передается той инструкции, в которой произошла ошибка.

Синтаксис 2:

Resume строка

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

Синтаксис 3:

Resume Next

После обработки ошибки управление передается инструкции, следующей за инструкцией, в которой произошла ошибка.

Инструкция

Exit

Останавливает выполнение процедуры.

Допустимые синтаксисы:

Exit Sub

Exit Function

  • Exit Property

  • <
    Подпрограмма обработки ошибки обычно включает объект Err, который содержит информацию об ошибках выполнения. Приведем свойства и методы объекта Err.

    Свойства объекта Err



    Number



    Возвращает код ошибки



    Source



    Имя текущего проекта VBA



    Description



    Возвращает строковое выражение, содержащее текст сообщения об ошибке



    HelpFile



    Полное имя (включая диск и путь) файла справки VBA



    HelpContext



    Контекстный идентификатор файла справки VBA, соответствующий ошибке с кодом, указанным в свойстве

    Number



    LastDLLError



    Содержит системный код ошибки для последнего вызова библиотеки динамической компоновки (DLL)

    Методы объекта Err



    Clear



    Очищает все значения свойств объекта Err. Метод clear используется для явной очистки значений свойств объекта Err после завершения обработки ошибки. Это необходимо, например, при отложенной обработке ошибки, которая задается инструкцией on

    Error Resume Next



    Raise



    Создает ошибку выполнения. Используется при моделировании ситуаций ошибки.

    Синтаксис:

    Raise number, source, description, helpfile, helpcontext

    Аргументы:

  • number — номер ошибки, т. е. целое число от 0 до 65535

  • source — строковое выражение, определяющее имя объекта или приложения, в котором возникла ошибка

  • description — строковое выражение, содержащее описание ошибки

  • Helpfile — полное имя (включая диск и путь) файла справки Microsoft Windows, содержащего описание данной ошибки

    helpcontext — контекстный идентификатор, определяющий соответствующий обрабатываемой ошибке раздел в файле, указанном в аргументе helpfile

  • На конкретном примере покажем, как применяется объект Err при создании обработчика ошибок. В предыдущем разделе в процессе создания диалотового окна деление и связанной с ним программы, на первый взгляд были предусмотрены все возможные ошибки. Но это только на первый взгляд. Введем, например, в поле Знаменатель значение 1е-40. Это число ничем не лучше или не хуже любого другого числа типа single.


    Тем не менее, вместо вывода результата произойдет аварийное прерывание выполнения программы с отображением сообщения об ошибке переполнения. Усовершенствуем программу с учетом возможности обработки подобной ошибки. В обработчике ошибок предусмотрим два отклика:

  • Пользователь информируется программой в случае появления ошибки переполнения, знаменателю и числителю присваиваются 1 и с этими данными проводятся вычисления.

  • При появлении ошибки, отличной от ошибки переполнения, выполнение программы прерывается с информированием пользователя об ошибке (рис. 12.4).



    Рис. 12.4. Диалоговое окно с указанием типа ошибки

    Private Sub CommandButtonl_Click()

    Dim Числитель, Знаменатель, Результат As Single

    '

    ' Передача управления на обработчик ошибок,

    ' помеченный меткой Обработка

    '

    On Error GoTo Обработка

    '

    ' Проверка, является ли числитель числом

    '

    If IsNumeric(TextBoxl.Text) = False Then MsgBox "Ошибка в числителе",

    vblnformation, "Деление" TextBoxl.SetFocus

    Exit Sub

    End If

    ' Проверка, является ли знаменатель числом

    '

    If IsNumeric(TextBox2.Text) = False Then

    MsgBox "Ошибка в знаменателе",

    vblnformation, "Деление"

    TextBox2.SetFocus

    Exit Sub

    End If

    '

    ' Проверка, не является ли знаменатель нулем

    '

    If CDbl(TextBox2.Text) = 0 Then

    MsgBox "Знаменатель не может быть нулем", vblnformation, "Деление"

    TextBox2.SetFocus

    Exit Sub

    End If

    '

    Числитель = CDbl(TextBoxl.Text)

    Знаменатель = CDbl(TextBox2.Text)

    Результат = Числитель / Знаменатель

    TextBox3 . Text = CStr (.Результат)

    '

    ' Выход из процедуры в случае успешного нахождения результата

    '

    Exit Sub

    '

    ' Обработчик ошибок

    '

    Обработка: Select Case Err.Number

    '

    ' Обработка ошибки переполнения

    '

    Case Is = 6

    MsgBox " Произошла ошибка переполнения",

    vblnformation, "Деление"

    TextBoxl.Text = 1

    TextBox2.Text = 1

    Знаменатель = 1

    Числитель = 1 Resume

    ' Обработка любой другой ошибки

    '

    Case Else

    MsgBox "Произошла ошибка: " & Err.Description &

    vblnformation, "Деление"

    Exit Sub

    End Select

    End Sub

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




    Содержание раздела