Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 07 VB Обработка ошибок.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
91.65 Кб
Скачать

Продолжение выполнения программы

Завершив обработку ошибки, следует продолжить нормальное выполнение программы. Ключевое слово 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 ,”Ошибка" ‘ вывод окна сообщений