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

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

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

Сравнение обработчиков ошибок с защитными техниками программирования

Обработчики ошибок являются не только механизмом для защиты программы от ошибок времени исполнения. Например, следующий код программы, чтобы проверить перед открытием файла его наличие на диске, использует метод File.Exists из пространства имен System.IO библиотеки классов .NET Framework:

If File.Exists("a:\Fileopen.bmp") Then
  PictureBox1.Image = _
    System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")
Else
  MsgBox("Не могу найти Fileopen.bmp на диске A.")
End If

Этот оператор If \dots Then не является обработчиком ошибок, так как он не предотвращает остановку программы из-за ошибки времени исполнения. Это просто методика проверки, которую некоторые программисты называют защитным программированием. Этот оператор использует удобный метод из библиотеки классов .NET Framework, чтобы проверить возможность выполнения файловой операции, прежде чем на самом деле пытаться ее выполнить. И, в данном конкретном случае, поверка наличия файла с помощью метода .NET Framework работает быстрее, чем ожидание, пока Visual Basic сгенерирует исключение и восстановится после ошибки времени исполнения с помощью обработчика ошибок.

Примечание. Чтобы заставить работать такую логику программы, в самое начало кода программы для формы необходимо включить следующий оператор, создающий ссылку на используемую библиотеку классов .NET Framework: Imports System.IO За дополнительной информацией об использовании оператора Imports для использования объектов, свойств и методов из библиотек классов .NET Framework обратитесь к "Переменные и операторы Visual Basic .NET" .

Когда нужно использовать защитные методики программирования, а когда обработчики ошибок? Ответ зависит от того, насколько часто, по вашему мнению, будет возникать проблема с операторами, которые вы планируете использовать. Если исключение или ошибка времени исполнения будет возникать довольно редко, скажем, менее чем в 25% случаев исполнения данного конкретного кода, то использование обработчика ошибок может оказаться наиболее эффективным способом. Обработчики ошибок также более удобны, если у вас более одного проверяемого условия, и если вы хотите предоставить пользователю различные возможности реакции на ошибку. Однако если существует реальная возможность того, что данный кусок кода будет приводить к ошибкам времени исполнения в более чем 25% случаев его исполнения, то обычно защитная методика программирования является наиболее эффективным способом управления. Как уже было сказано при обсуждении блока кода If \dots Then, метод File.Exists на самом деле работает быстрее, чем использование обработчика ошибок Try...Catch, так что имеет смысл использовать защитную методику программирования, если большое значение имеет производительность. Наконец, лучше всего использовать в коде комбинацию защитной методики программирования и структурной обработки ошибок.

Следующий шаг: оператор Exit Try

Прежде чем вы перейдете к "Использование модулей и процедур" , посмотрите на еще один вариант синтаксиса блоков кода Try...Catch, который может быть полезен - оператор Exit Try. Exit Try - это быстрая и простая "грубая" методика преждевременного выхода из блока кода Try...Catch ; если вы уже писали программы на Visual Basic, то вы можете заметить его сходство с операторами Exit For и Exit Sub, которые позволяют раньше времени покидать структурные конструкции. С помощью оператора Exit Try можно полностью покинуть текущий блок кода Try или Catch. Если есть блок кода Finally, то этот код будет выполнен, однако Exit Try позволяет перепрыгнуть через все остальные операторы Try или Catch.

В следующем примере процедуры показано, как работает оператор Exit Try. Сначала он проверяет, установлено ли свойство Enabled объекта PictureBox1 в значение PictureBox1 - это может указывать на то, что область вывода изображений еще не готова к приему данных. Если область вывода еще не доступна, то оператор Exit Try пропускает остальную часть блока кода до конца блока Catch, и попытка загрузки файла не производится.

Try
  If PictureBox1.Enabled = False Then Exit Try
    PictureBox1.Image = _
      System.Drawing.Bitmap.FromFile ("a:\Fileopen.bmp")
Catch
  Retries += 1
  If Retries <= 2 Then
    MsgBox("Пожалуйста, вставьте дискету в дисковод A!")
  Else
    MsgBox("Загрузка файла невозможна")
    Button1.Enabled = False
  End If
End Try

Этот пример дополняет последний обработчик ошибок, с которым вы экспериментировали в этой лекции (проект Disk Drive Handler). Если вы хотите проверить оператор Exit Try в контексте этой программы, снова загрузите проект Disk Drive Handler и введите в Редакторе кода оператор If, который содержит Exit Try. Вам также потребуется использовать окно Properties (Свойства), чтобы отключить объект вывода изображений в форме (другими словами, установить его свойство Enabled на значение False ).

Поздравляем! Вы изучили много важных базовых методик программирования на Visual Basic .NET и научились писать обработчики ошибок. Теперь вы можно перейти к более сложным вопросам программирования.

Краткая справка по лекции 9

Чтобы Сделайте следующее
Обнаружить и обработать ошибки времени исполнения

Создайте с помощью блоков кода Try \dots Catch обработчик ошибок. Например, следующий код обработчика ошибок проверяет проблемы с путем или дисководом:

Try
  PictureBox1.Image = _
    System.Drawing.Bitmap.FromFile _
    ("a:\fileopen.bmp")
Catch
  MsgBox("Проверьте путь или вставьте диск")
Finally
  MsgBox("Обработка ошибок завершена")
End Try
Проверить в обработчике события конкретные условия ошибки

Используйте оператор Catch When и свойство Err.Number. Например:

Try
  PictureBox1.Image = _
    System.Drawing.Bitmap.FromFile _
    ("a:\fileopen.bmp")
Catch When Err.Number = 53  ' если File Not Found
  MsgBox("Проверьте путь или вставьте диск")
Catch When Err.Number = 7  ' если Out Of Memory
  MsgBox("Это действительно точечный рисунок?", , _
    Err.Description)
Catch
  MsgBox("Проблема с загрузкой файла", , _
    Err.Description)
End Try
Создать в программе собственные ошибки

Используйте метод Err.Raise. Например, следующий код генерирует ошибку Disk Full и обрабатывает ее:

Try
  Err.Raise(61)     ' генерируем ошибку Disk Full
Catch When Err.Number = 61
  MsgBox("Ошибка: Диск заполнен")
End Try
Написать вложенные обработчики ошибок Try \dots Catch

Поместите один блок кода Try \dots Catch внутри другого. Например:

Try
  PictureBox1.Image = _
    System.Drawing.Bitmap.FromFile _
    ("a:\fileopen.bmp")
Catch
  MsgBox("Вставьте диск в дисковод A!")
  Try
    PictureBox1.Image = _
      System.Drawing.Bitmap.FromFile _
      ("a:\fileopen.bmp")
  Catch
    MsgBox("Загрузка изображения отключена")
    Button1.Enabled = False
  End Try
End Try
Выйти из текущего блока кода Try или Catch

Используйте в блоке кода Try или Catch оператор Exit Try. Например:

If PictureBox1.Enabled = False Then Exit Try
< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Жанболат Шаймерден
Жанболат Шаймерден

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

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