logo
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 3

Объект Err

Объект Err содержит информацию о последней ошибке выполнения. Объект Err является внутренним объектом с глобальной областью определения. Нет необходимости в создании этого объекта. Он создается вместе с проектом. Вот список свойств объекта Err и их значений:

Таблица 10.1. Описание свойств объекта Err

Свойство

Значение

Number

Номер (код) ошибки. Это свойство по умолчанию.

Source

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

Description

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

HelpFile

Полное имя (включая диск и путь) файла справки VBA. Опять таки для собственных ошибок следует подготовить справочную систему и задавать путь к ней в этом свойстве.

HelpContext

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

LastDLLError

Содержит системный код ошибки для последнего вызова DLL. Значение свойства LastDLLError доступно только для чтения. В лекции, посвященной работе с функциями Win32 API, подробно рассматривалось использование этого свойства.

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

Public Function Fact2(ByVal N As Integer) As Integer

'Функция спроектирована для вычисления факториалов чисел, не больших 7

#If conDebug Then

Debug.Assert (N >= 0) And (N < 8)

#End If

If (N = 0) Or (N = 1) Then ' базис индукции.

Fact2 = 1 ' 0! =1.

Else ' рекурсивный вызов в случае N > 0.

Fact2 = Fact2(N - 1) * N

End If

#If conDebug Then

Debug.Assert Fact2 <= 5040

#End If

End Function

Заметьте, поскольку флаг отладки (conDebug) уже отключен, то Assert - утверждения не работают. Приведем процедуру, вызывающую функцию fact2 первый раз корректно, второй - нет, что приведет к ошибке, ее перехвату и исправлению ситуации:

Public Sub TestFact2()

Dim Msg As String

Dim VictoryCount As Integer, Prize As Long

On Error GoTo ErrHandler1

VictoryCount = 5

Prize = Fact2(VictoryCount) * 5

Debug.Print VictoryCount, Prize

VictoryCount = 10

Prize = Fact2(VictoryCount) * 5

Debug.Print VictoryCount, Prize

Exit Sub

ErrHandler1:

Msg = "Ошибка # " & Err.Number & " возникла в " & Err.Source _

& vbCrLf & " Описание: " & Err.Description _

& vbCrLf & " HelpFile: " & Err.HelpFile _

& vbCrLf & " HelpContext: " & Err.HelpContext

MsgBox Msg, vbMsgBoxHelpButton, "Error", Err.HelpFile, Err.HelpContext

'Грубое устранение причин ошибки

Err.Clear

If VictoryCount < 0 Then VictoryCount = 0

If VictoryCount > 7 Then VictoryCount = 7

Resume

End Sub

Пример 10.3. (html, txt)

Вот как выглядит окно сообщения, выведенное в обработчике ошибки.

Рис. 10.16.  Сообщение, сформированное в обработчике ошибки

Заметьте, после выдачи сообщения процедура нормально завершает свою работу и в окне проверки Immediate появятся следующие результаты:

5 600

7 25200

Объект Err специально спроектирован для работы на этапе обнаружения и исправления ошибок периода выполнения. Он заменил ранее существовавшие функцию и оператор Err. Для совместимости с ними свойство Number реализовано, как свойство по умолчанию и его можно не указывать. Если в борьбе с ошибками на этапе отладки важную роль играет объект Debug, то не менее важна роль объекта Err при борьбе с ошибками периода выполнения. Также как и объект Debug, объект Err имеет всего два метода - Clear и Raise. Рассмотрим их подробнее.