Спонсор: Microsoft
Опубликован: 31.08.2006 | Доступ: свободный | Студентов: 3925 / 218 | Оценка: 4.14 / 3.89 | Длительность: 39:16:00
ISBN: 978-5-9570-0021-3
Лекция 10:

Перехват ошибок с помощью структурной обработки ошибок

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >

Использование блока Finally для выполнения задач устранения последствий ошибок

Как отмечалось ранее в этой лекции при рассмотрении синтаксиса оператора Try...Catch, в этом операторе можно использовать дополнительный блок Finally. Этот блок исполняет операторы независимо от того, как компилятор выполняет блоки Try или Catch. Другими словами, независимо от того, приводят ли операторы в блоке Try к ошибке времени исполнения, может иметься код, который необходимо выполнить каждый раз по завершении действия обработчика ошибок. Например, можно обновить переменные или свойства, отобразить результаты вычислений в окне сообщения или как-то иначе, выполнить "очистку" переменных или отключение ненужных объектов формы.

В следующем упражнении продемонстрировано, как работает блок Finally, отображающий второе окно сообщения, не зависящее от того, привел ли метод FromFile к ошибке времени исполнения, или нет.

Использование Finally для отображения окна сообщения
  1. Отобразите процедуру события 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 можно использовать для обновления значений переменных или свойств, отображения данных или выполнения других операций.

  2. Удалите дискету из дисковода A, а затем щелкните на кнопке Start (Начать) и запустите программу.
  3. Щелкните на кнопке Проверить диск. Обработчик ошибок отобразит диалоговое окно, которое просит вас вставить диск в дисковод A.
  4. Щелкните на OK. Программа выполнит блок Finally обработчика ошибок, и появится следующее окно сообщения.


  5. Щелкните на OK, вставьте дискету в дисковод A, а затем снова щелкните на кнопке Проверить диск. Как и ожидалось, файл появляется в области вывода изображений. В дополнение к этому был выполнен блок Finally, и снова появилось окно сообщения "Обработка ошибок выполнена". Как уже отмечалось, операторы Finally исполняются в конце блока Try...Catch независимо от того, была ли ошибка, или нет.
  6. Чтобы завершить выполнение программы, щелкните на 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.

Нoмер ошибки Сообщение об ошибке по умолчанию
5 Procedure call or argument is not valid (Недопустимый вызов процедуры или аргумент)
6 Overflow (Переполнение)
7 Out of memory (Недостаточно памяти)
9 Subscript out of range (Индекс массива выходит за его границы)
11 Division by zero (Деление на ноль)
13 Type mismatch (Несоответствие типов переменных)
48 Error in loading DLL (Ошибка при загрузке DLL)
51 Internal error (Внутренняя ошибка)
52 Bad File name or number (Неверное имя файла или число)
53 File not found (Файл не найден)
55 File already open (Файл уже открыт)
57 Device I/O error (Ошибка устройства ввода-вывода)
58 File already exists (Файл уже существует)
61 Disk full (Диск переполнен)
62 Input past end of File (Ввод после конца файла)
67 Too many Files (Слишком много файлов)
68 Device unavailable (Устройство недоступно)
70 Permission denied (Доступ запрещен (недостаточно прав доступа))
71 Disk not ready (Диск не готов)
74 Can't rename with different drive (Не могу переименовать с использованием другого дисковода)
75 Path/File access error (Ошибка доступа к папке/файлу)
76 Path not found (Путь не найден)
91 Object variable or With block variable not set (Не установлены переменная объекта или переменная блока With)
321 File format is not valid (Недопустимый формат файла)
322 Cannot create necessary temporary File (Не могу создать требуемый временный файл)
380 Property value is not valid (Недопустимое значение свойства)
381 Property array index is not valid (Недопустимый индекс массива свойств)
422 Property not found (Свойство не найдено)
423 Property or method not found (Свойство или метод не найдены)
424 Object required (Требуется объект)
429 Cannot create Microsoft ActiveX component (Не могу создать компоненту Microsoft ActiveX)
430 Class does not support Automation or does not support expected interface (Класс не поддерживает Automation или не поддерживает ожидаемый интерфейс)
438 Object does not support this property or method (Объект не поддерживает это свойство или метод)
440 Automation error (Ошибка Automation)
460 Clipboard format is not valid (Недопустимый формат буфера обмена)
461 Method or data member not found (Метод или член данных не найден)
462 The remote server machine does not exist or is unavailable (Удаленная серверная машина не существует или недоступна)
463 Class not registered on local machine (Класс не зарегистрирован на локальной машине)
481 Picture is not valid (Недопустимое изображение)
482 Printer error (Ошибка принтера)

Следующее упражнение использует для тестирования более чем одного условия ошибки времени исполнения в обработчике ошибок Try...Catch свойства Err.Number и Err.Description. Использование этой функции стало возможным благодаря записи Catch When, которая позволяет проверять в блоке кода Try...Catch конкретные ошибки.

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Светлана Ведяева
Светлана Ведяева
Россия, Саратов