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




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

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

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

Оператор On Error должен заканчиваться Resume или другим оператором завершения обработки ошибок, иначе при компиляции возникнет ошибка в структуре программы. Для этого могут использоваться следующие операторы:

Resume / Resume Next / Resume label;

Exit Sub / Exit Function / Exit Procedure;

End / Stop.

Чтобы обработчик ошибок не выполнялся всегда, следует поставить перед меткой обработчика оператор Exit Sub, Exit Function или Exit Procedure. В результате в этом месте происходит выход из процедуры, и остальная часть кода выполняется только при появлении ошибки. Свойство Description объекта Err возвращает текст системного описания ошибки. Это можно использовать для вывода текста сообщения об ошибке в обработчике ошибок, поскольку системный вывод сообщения об ошибке при использовании обработчика ошибок не производится.

Типичным примером использования обработчика ошибок может быть обработка ошибок ввода данных и ошибок математических операций:

‘процедура обработки щелчка на кнопке cmdCalc (Вычислить)

Private Sub cmdCalc_Click()

Dim X As Single ‘ объявление вещественной переменной X

Dim Y As Single ‘ объявление вещественных переменной Y

On Error GoTo mErr ‘ вызов обработчика ошибок, который в случае возникновения ошибки

‘ передает управление оператору, следующему за меткой mErr

X = txtX ‘ считывание данных из текстового поля txtX в переменную X

Y = Sqr (1 / X) ‘ вычисление значения переменной Y

lblY = y ‘ передача значения переменной у в надпись lblY

Exit Sub ‘ выход из процедуры, если все операции выполнены без ошибок

mErr: ‘ метка, которая в случае возникновения ошибки получает управление

Dim S As String ‘ объявление строковой переменной, в которой хранится текст сообщения

S = "Ошибка № " & Err. Number & vbCrLf & Err. Description

‘ формирование текста сообщения, содержащего номер и

‘ соответствующее системное описание ошибки

MsgBox S, vbCritical,”Ошибка" ‘ вывод окна сообщений

End Sub

Следует отметить, что текст системного описания ошибки может быть совершенно не понятен пользователю, даже если он владеет английским языком. На рисунке показано сообщение, которое выводит приведённый выше фрагмент кода в том случае, если пользователь ввёл в поле txtX нечисловое значение. В этом случае ошибка возникает в операторе X = txtX, поскольку компилятор не может преобразовать произвольное строковое значение в вещественное число одинарной точности.

Ошибки такого типа являются ошибками преобразования типа данных (Type mismatch – несоответствие типов). Но термин несоответствие типов, очевидный для разработчика, может быть совершенно не ясен пользователю, далёкому от программирования. Поэтому в этом случае целесообразно вывести сообщение более понятное для пользователя, например: “Ведите в поле число”. Точно так же желательно обработать все ошибки, которые вы можете предусмотреть, и оставить системное сообщение для ошибок, которые возникают по непредусмотренным разработчиком причинам.

Для этого удобно в разделе обработки ошибок воспользоваться оператором Select Case, у которого:

Ø параметром оператора является выражение Err.Number, которое содержит номер последней совершённой ошибки;

Ø после служебного слова Case указывается номер предусмотренной ошибки и формируется соответствующий текст сообщения;

Ø после служебного слова Case Else формируется текст системного сообщения для непредусмотренных разработчиком ошибок.

Фрагмент раздела обработки ошибок может иметь следующий вид:

Dim S As String ‘ объявление строковой переменной, в которой хранится текст сообщения

Select Case Err. Number

Case 5 ‘ формирование текста сообщения об ошибке № 5

S = "Корень из отрицательного числа"

Case 6 ‘ формирование текста сообщения об ошибке № 6

S = "Введено слишком большое число"

Case 11 ‘ формирование текста сообщения об ошибке № 11

S = "Деление на ноль"

Case 13 ‘ формирование текста сообщения об ошибке № 13

S = "Введено не число"

Case Else ‘ формирование текста системного сообщения о непредусмотренной ошибке

S = "ОшибкаU№U"U&UErr. NumberU&UvbCrLfU&UErr. Description

End Select ‘ конец оператора Select Case

MsgBox S, vbCritical,”Ошибка" ‘ вывод окна сообщений



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: