Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 3....doc
Скачиваний:
37
Добавлен:
17.12.2018
Размер:
1.65 Mб
Скачать

Метод Clear

Его синтаксис:

Err.Clear

Этот метод используется для явной очистки значений свойств объекта Err после завершения обработки ошибки. Автоматическая очистка свойств Err происходит также при выполнении операторов:

  • оператора Resume любого вида;

  • Exit Sub, Exit Function, Exit Property;

  • оператора On Error любого вида.

Метод Raise

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

Err.Raise number, source, description, helpfile, helpcontext

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

Параметр Number имеет тип Long и определяет код ошибки. Коды ошибок (как внутренних, так и определяемых пользователем) лежат в диапазоне 0-65535. При этом коды от 0 до 512 зарезервированы за системными ошибками VBA. При возбуждении собственных ошибок при задании параметра Number к ее собственному коду необходимо добавлять константу vbObjectError + 512, что позволяет системе отличать внутренние и пользовательские ошибки.

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

Класс и обработка ошибок

Мы уже говорили, что важная часть работы программиста по отладке программы состоит в том, чтобы предохранить работающую программу от прерывания ее работы при возникновении внутренних ошибок. Не менее важно, особенно при работе с объектами пользовательских классов, предусмотреть возможность появления исключительных ситуаций, генерировать и соответственно обрабатывать собственные ошибки класса. В качестве примера приведем класс Day, у которого есть два свойства - дата и температура на эту дату. Методы класса, (их реализацию мы не приводим) исходят из того, что летом должно быть жарко, а зимой - холодно. Нарушение этого условия приведет к неверным результатам. Поэтому в состав класса включен метод CheckDay, проверяющий корректность задания свойств. В случае несоблюдения требуемых условий метод генерирует собственные ошибки класса. Вот описание нашего класса:

Option Explicit

'Класс Day

'Свойства класса

Private today As Date

Private temperature As Integer

Public Property Get Сегодня() As Date

Сегодня = today

End Property

Public Property Let Сегодня(ByVal NewValue As Date)

today = NewValue

End Property

Public Property Get Температура() As Integer

Температура = temperature

End Property

Public Property Let Температура(ByVal NewValue As Integer)

temperature = NewValue

End Property

Public Sub CheckDay()

Dim Desc As String

Dim Numb As Long

Dim Source As String

'Проверка свойств объекта

Select Case Month(Сегодня)

Case 6 To 8

If Температура < 0 Then

'Исключительная ситуация

Desc = "Ошибка: Работа с объектом предполагает положительную

летнюю температуру!"

Numb = vbObjectError + 513

Source = " Метод CheckDay класса Day "

Err.Raise Numb, Source, Desc

End If

Case 1 To 2, 12

If Температура > 0 Then

'Исключительная ситуация

Desc = "Ошибка: Работа с объектом предполагает отрицательную

зимнюю температуру!"

Numb = vbObjectError + 514

Source = " Метод CheckDay класса Day "

Err.Raise Numb, Source, Desc

End If

End Select

End Sub

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

Приведем теперь процедуру, работающую с объектами, этого класса:

Public Sub WorkWithDay()

'Работа с объектами класса Day

Dim myday As New Day

Dim Msg As String

'Охраняемый блок

On Error GoTo ErrorHandler

myday.Сегодня = "9.8.99"

myday.Температура = -15

myday.CheckDay

Debug.Print myday.Сегодня, myday.Температура

Exit Sub

ErrorHandler:

If Err.Number = vbObjectError + 513 Then

Msg = vbCrLf & "Введите температуру сегодняшнего дня " _

& myday.Сегодня & vbCrLf & " Учтите, она должна быть

положительной"

myday.Температура = InputBox(Err.Source & vbCrLf &

Err.Description & Msg, "CheckDay", 15)

ElseIf Err.Number = vbObjectError + 514 Then

Msg = vbCrLf & "Введите температуру сегодняшнего дня " _

& myday.Сегодня & vbCrLf & " Учтите, она должна быть

отрицательной"

myday.Температура = InputBox(Err.Source & vbCrLf &

Err.Description & Msg, "CheckDay", -15)

End If

Resume

End Sub

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

Заметьте, эта процедура, работающая с объектом myday класса Day, построена по всем правилам, - в ней есть охраняемый блок. При возникновении ошибки, а она действительно возникает из-за некорректного задания свойств объекта, производится захват ошибки, управление передается предусмотренному обработчику ошибки. В обработчике пользователю разъясняется суть ситуации, приведшей к ошибке, после чего он вводит корректные данные. Взгляните, как выглядит окно для диалога с пользователем на этом этапе:

Рис. 10.17.  Окно диалога с пользователем

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

09.08.99 25