Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методический комплекс ПЗ СППР 2011.doc
Скачиваний:
27
Добавлен:
16.02.2016
Размер:
1.27 Mб
Скачать

4. Обработка ошибок

До этого момента мы рассматривали ошибки, которые совершает программист. В настоящем разделе речь пойдет о методах обнаружения ошибок, которые допускает I пользователь. Несмотря на самые детальные объяснения, предоставляемые пользователям, никогда нельзя быть полностью уверенным во введении только правильных I данных. Конечно, некорректные входные данные приводят к получению совершен-1 но невообразимых результатов, даже если программа выполняется совершенно правильно. Частью обязанностей разработчика (стоит заметить, самая важная из обязанностей) является обнаружение и обработка ошибок пользователей.

Оператор OnError

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

OnErrorResumeNext

Application.DisplayAlerts = False

Worksheets("Результаты").Delete

MsgBox("Программа продолжает свое обычное выполнение")

Целью данного кода является удаление листа Результаты. Но такого листа может просто не существовать, в результате оператор вызова метода Delete приведет к возвращению ошибки выполнения. Оператор On Error Resume Next можно интерпретировать следующим образом: "в случае ошибки игнорировать ее и продолжать выполнение процедуры со следующей строки". Если лист Результаты отсутствует, сообщение об ошибке отображаться не будет, а выполняется оператор MsgBox.

Еще один вариант этой конструкции показан далее. Если программой обнаруживается ошибка, то управление и в этом случае передается следующему оператору, но свойство Number встроенного объекта Err устанавливается в ненулевое значение, что можно проверить с помощью оператора If. Каждому типу ошибки соответствует определенный код, который сохраняется во встроенном объекте Err. Например, рассмотренная ниже операция (удаление несуществующего листа) приводит к получению ошибки, имеющей код 9. Код ошибки можно получить с помощью приведенной ниже последовательности операторов. В результате выполнения этого фрагмента кода выводится окно сообщения, показанное на рис. 10. Если вы не планируете постоянно создавать большие приложения, то можете не изучать коды ошибок. Достаточно помнить, что в случае возникновения ошибки объект Err имеет ненулевое значение, и значение 0 — в противном случае.

On Error Resume Next

Application. DisplayAlerts = False

Worksheets ("Результаты") .Delete

If Err <> 0 Then MsgBox "Лист Результаты удалить нельзя!"

MsgBox("Программа продолжает свое обычное выполнение")

Рис. 10. Сообщение с кодом ошибки

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

Sub TryToOpen ()

On Error GoTo ErrorHandling

Workbook.Open "C:\VBABook\Ranges.xls"

Операторы

Exit Sub

ErrorHandling

MsgBox "Файл Ranges.xls удалению не подлежит"

End

End Sub

Данная процедура предназначена для открытия файла Ranges.xls, расположенного в папке VBABook на диске С:. После открытия над файлом выполняется ряд операций (в коде, обозначенном словом Операторы). Всегда существует вероятность того, что интересующий программу файл не существует или существует, но в другой папке. Для обработки таких ситуаций используется оператор On Error GoTo ErrorHandling. Эта строка имеет следующее предписание: "Следить за ошибками. Если ошибка произошла, перейти по метке ErrorHandling к следующим операторам процедуры. В противном случае продолжить нормальное выполнение процедуры". В процедуре может использоваться любое количеством меток. После каждой метки вводится двоеточие, а сами метки имеют произвольные имена. Каждая метка используется в качестве закладки, указывая место в процедуре, к которому перенаправляет операторGoTo.

Обратите внимание, что при отсутствии ошибок в процедуру необходимо добавить оператор Exit Sub. Без него файл Results .xls будет открыт и при этом будут выполнены все операторы, обозначенные как Операторы— все правильно, как и рассчитывалось. Однако затем выполняется оператор MsgBox, и программа завершает свою работу, что является нежелательным результатом.

Если в процедуре присутствует оператор От\ Error GoTo, то он находится в "постоянной готовности", ожидая возникновения ошибки. Если необходимо отключить отслеживание ошибок, то воспользуйтесь оператором On Error GoTo 0. Это выражение предотвращает отслеживание любых ошибок.

Самостоятельное обнаружение ошибок

Кроме оператора On Error, явную проверку правильности введенных данных можно выполнять и вручную. В следующих главах проверка правильности введенных данных в пользовательской форме, как правило, выполняется в процедуре OKButton_Click. Ниже показан типичный пример такой проверки. Отображенное на рис..11 диалоговое окно содержит два текстовых поля, в которые пользователь должен ввести данные. Эти поля называются DatelBox и Date2Box. Существует несколько способов введения неправильных данных: поля могут остаться пустыми, введенные даты могут оказаться некорректными (или вообще не датами) или начальная дата более поздняя, чем конечная. Если надеяться, что пользователь не будет совершать такие глупые ошибки, то останется только полагаться на удачу.

Рис. 11. Диалоговое окно ввода дат

В следующей процедуре не выполняется проверка введенных данных. Введенные пользователем даты просто сохраняются в общедоступных переменных BegDate и EndDate в надежде, что они введены правильно. Если в диалоговом окне будут введены неправильные даты, о результате работы оставшейся части приложения можно только догадываться.

Private Sub OKButton_Click()

BegDate = DatelBox

EndDate = Date2Box

Unload Me

End Sub

Целесообразнее проверять некорректность полученных приложением дат так, как показано в приведенном ниже коде. Код анализирует все элементы управления на пользовательской форме и находит текстовые поля, в которые вводятся данные. После нахождения текстового поля процедура проверяет, не пустое ли оно; если поле не пустое, то правильная ли дата в него введена (для этого используется исключительно полезная функция VBA isDate). Если поле пустое или оно содержит некорректную дату, выводится сообщение об ошибке; в результате текстовое поле с ошибочными данными активизируется. После этого выполнение процедуры завершается без выгрузки формы(т.е. пользователю предлагается повторно ввести данные). ЕслиI ошибки не обнаружены, то выполняется вторая проверка. На этот раз анализируется ситуация, когда вторая дата оказывается более ранней, чем первая. Если это так, ю выводится сообщение об ошибке и активизируется первое поле ввода данных. I Процедура завершает работу без выгрузки пользовательской формы. К моменту выгрузки пользовательской формы программист может быть уверен, что переменные HDateиEndDateсодержат действительные даты.

Private Sub OKButton_Click()

Dim ctl As Control

For Each ctl In Me.Control

If TypeName(ctl) = "TextBox" Then

If ctl.Value = "" Or Not IsDate(ctl) Then

MsgBox"Введите в поля корректные даты", _

vblnformation, "Неправильные даты"

ctl.SetFocus

ExitSub

End If

End If Next

BegDate = DatelBox

EndDate = Date2Box

If BegDate >= EndDate Then

MsgBox"Начальная дата должна быть меньше конечной", _

vblnformation, "неправильные даты"

DatelBox.SetFocus

Exit Sub

End if

Unload Me

End Sub

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