Иллюстрированный самоучитель по Visual Basic .NET

Проверка ошибок и обработка исключений

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

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

Впрочем, выполнить эти требования бывает непросто. Сетевой код обычно никак не связан с объектами, состояние которых требуется сохранить. Соответственно, программисту нужны средства для передачи управления и для оповещения других объектов о происходящем, чтобы они могли принять нужные меры.

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

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

Итак, в отличие от прежних версий VB в VB.NET поддерживается механизм структурной обработки исключений (или просто обработки исключений). В этой главе вы не только познакомитесь с синтаксисом обработки исключений в приложениях VB.NET, но и узнаете, какими преимуществами обладает этот механизм. В частности, при обработке исключений отпадает необходимость даже в более или менее оправданном применении GoTo, описанном в главе 3. Однако ничто хорошее не дается бесплатно, поэтому вы также должны помнить о некоторых тонкостях, связанных со структурной обработкой исключений.

Примечание
Читатели, привыкшие к синтаксису прежних версий VB, могут продолжать использовать старую конструкцию On Error. Но в новых программах это выглядит довольно глупо. Давно пора отказаться от архаичного способа обработки ошибок, появившегося на заре развития вычислительной техники! (Одновременное использование двух способов в одной процедуре не разрешается.)


Традиционный механизм обработки ошибок, использовавшийся в прежних версиях VB, а также в программировании СОМ и Windows, основан на проверке возвращаемого значения функции и выборе действий. Обычно для проверки возвращаемого значения в программе создается аналог конструкции Select Case, причем значения интерпретируются абсолютно произвольно. Например, в одном случае 0 означает успех, а в другом – неудачу.

А в приведенном ниже фрагменте кода VB6 коды выглядят и вовсе странно:

Select Case Error-Number
Case 57
MsgBox "Your printer may be off-line."
Case 68
MsgBox "Is there a printer available?"
' Другие секции Case
Case Else
' Все остальные случаи
End Select

Подобные конструкции работают, но их трудно читать и еще труднее изменять в процессе сопровождения программы. Можно уверенно сказать, что эта схема таит в себе широкие возможности для ошибок программирования. Например, вы можете перепутать коды ошибок или забыть проверить некоторые из возвращаемых значений. Кроме того, писать один и тот же код проверки при каждом вызове функции Windows API, по крайней мере, утомительно. Хотя в некоторых ситуациях возвращаемое значение приходится проверять независимо от выбранной схемы обработки ошибок, не стоит превращать это в постоянную практику. Также следует учитывать фактор эффективности: структурная обработка исключений быстрее программируется, отнимает меньше времени при сопровождении, а нередко и выполняется быстрее!

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.