Перехват ошибок с помощью структурной обработки ошибок
Использование блока Finally для выполнения задач устранения последствий ошибок
Как отмечалось ранее в этой лекции при рассмотрении синтаксиса оператора Try...Catch, в этом операторе можно использовать дополнительный блок Finally. Этот блок исполняет операторы независимо от того, как компилятор выполняет блоки Try или Catch. Другими словами, независимо от того, приводят ли операторы в блоке Try к ошибке времени исполнения, может иметься код, который необходимо выполнить каждый раз по завершении действия обработчика ошибок. Например, можно обновить переменные или свойства, отобразить результаты вычислений в окне сообщения или как-то иначе, выполнить "очистку" переменных или отключение ненужных объектов формы.
В следующем упражнении продемонстрировано, как работает блок Finally, отображающий второе окно сообщения, не зависящее от того, привел ли метод FromFile к ошибке времени исполнения, или нет.
Использование Finally для отображения окна сообщения
-
Отобразите процедуру события Button1_Click, а затем отредактируйте блок кода Try...Catch так, чтобы он содержал над оператором End Try дополнительные строки кода. Готовый обработчик ошибок должен выглядеть так.
Try PictureBox1.Image = _ System.Drawing.Bitmap.FromFile("a:\Fileopen.bmp") Catch MsgBox("Пожалуйста, вставьте дискету в дисковод A!") Finally MsgBox("Обработка ошибок выполнена") End Try
Оператор Finally указывает компилятору, что завершающий блок кода должен выполняться независимо от того, обработана ошибка времени исполнения, или нет. Чтобы помочь вам точно разобраться, как это работает, я вставил после оператора Finally функцию MsgBox, которая отображает тестовое сообщение. Хотя это и полезно для тестирования, в реальной программе блок кода Finally можно использовать для обновления значений переменных или свойств, отображения данных или выполнения других операций.
- Удалите дискету из дисковода A, а затем щелкните на кнопке Start (Начать) и запустите программу.
- Щелкните на кнопке Проверить диск. Обработчик ошибок отобразит диалоговое окно, которое просит вас вставить диск в дисковод A.
-
Щелкните на OK. Программа выполнит блок Finally обработчика ошибок, и появится следующее окно сообщения.
- Щелкните на OK, вставьте дискету в дисковод A, а затем снова щелкните на кнопке Проверить диск. Как и ожидалось, файл появляется в области вывода изображений. В дополнение к этому был выполнен блок Finally, и снова появилось окно сообщения "Обработка ошибок выполнена". Как уже отмечалось, операторы Finally исполняются в конце блока Try...Catch независимо от того, была ли ошибка, или нет.
- Чтобы завершить выполнение программы, щелкните на OK, а затем на кнопке Закрыть формы.
Более сложные обработчики ошибок Try ... Catch
Когда ваши программы станут сложнее, полезно писать более сложные обработчики ошибок Try...Catch, которые будут отслеживать различные ошибки времени исполнения и управлять необычными ситуациями обработки ошибок. Try...Catch поддерживает эту возможность с помощью:
- разрешения ввода нескольких строк кода в каждом из блоков Try, Catch или Finally ;
- использования синтаксиса Catch When, который проверяет указанные условия возникновения ошибок;
- написания вложенных блоков кода Try...Catch, которые могут быть использованы для создания сложных, но надежных обработчиков ошибок.
В дополнение к этому специальный объект обработки ошибок с именем Err позволяет определять и обрабатывать в ваших программах конкретные ошибки времени исполнения. Все эти возможности обработки ошибок обсуждаются в следующем разделе.
Объект Err
Err - это специальный объект Visual Basic, в котором при каждом возникновении ошибки времени исполнения сохраняется подробная информация по этой ошибке. Наиболее полезными из свойств Err для определения ошибок времени исполнения являются Err.Number и Err.Description. Err.Number содержит номер самой последней из ошибок времени исполнения, а Err.Description содержит краткое сообщение об этой ошибке. Совместно используя в обработчике ошибок свойства Err.Number и Err.Description, можно распознавать конкретные ошибки и реагировать на них. Вы можете проинформировать пользователя о том, как себя вести в сложившейся ситуации.
Свойства Err.Number и Err.Description содержат информацию о самой последней ошибке времени исполнения.
Очистить объект Err вы можете с помощью метода Err.Clear (этот метод стирает информацию о предыдущей ошибке). Однако, если вы используете объект Err в блоке Catch, очистка объекта Err обычно необязательна, так как блоки Catch выполняются только при возникновении ошибки времени исполнения в соседнем с ними блоке кода Try.
Следующая таблица содержит перечень большинства ошибок времени исполнения, которые могут возникнуть в приложениях на Visual Basic. За дополнительной информацией по конкретной ошибке обратитесь к справочной системе Visual Studio. В дополнение к этим кодам ошибок, некоторые библиотеки Visual Basic и другие компоненты (такие, как базы данных и системные компоненты) предоставляют свои собственные уникальные сообщения об ошибках, которые часто можно встретить в справочной системе. Заметьте, что, не смотря на описания сообщений об ошибках, некоторые ошибки могут появляться не так, как вы этого ожидаете. Поэтому необходимо по возможности специально проверять номера ошибок, отслеживая изменение свойства Err.Number при выполнении программы. Неиспользуемые номера ошибок в диапазоне 1-1000 зарезервированы за будущим использованием в Visual Basic .NET.
Следующее упражнение использует для тестирования более чем одного условия ошибки времени исполнения в обработчике ошибок Try...Catch свойства Err.Number и Err.Description. Использование этой функции стало возможным благодаря записи Catch When, которая позволяет проверять в блоке кода Try...Catch конкретные ошибки.