Продолжение выполнения программы
Завершив обработку ошибки, следует продолжить нормальное выполнение программы. Ключевое слово Resume позволяет вернуться в строку, вызвавшую ошибку, для ее повторного выполнения, а оператор Resume Next возвращает в следующую за строкой с ошибкой строку. Синтаксис оператора Resume имеет вид:
Resume [ Next | Label ]
Оператор Resume Next можно использовать, вместе с оператором On Error, и тогда каждая строка, вызвавшая ошибку, игнорируется:
On Error Resume Next
Однако такая простейшая обработка ошибок не позволяет определить источники ошибки и исправить ее.
Обработка ошибок выполнения
В начале процедуры помещается оператор 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 ,”Ошибка" ‘ вывод окна сообщений
