Перехват ошибок с помощью структурной обработки ошибок
Сравнение обработчиков ошибок с защитными техниками программирования
Обработчики ошибок являются не только механизмом для защиты программы от ошибок времени исполнения. Например, следующий код программы, чтобы проверить перед открытием файла его наличие на диске, использует метод 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 Then не является обработчиком ошибок, так как он не предотвращает остановку программы из-за ошибки времени исполнения. Это просто методика проверки, которую некоторые программисты называют защитным программированием. Этот оператор использует удобный метод из библиотеки классов .NET Framework, чтобы проверить возможность выполнения файловой операции, прежде чем на самом деле пытаться ее выполнить. И, в данном конкретном случае, поверка наличия файла с помощью метода .NET Framework работает быстрее, чем ожидание, пока Visual Basic сгенерирует исключение и восстановится после ошибки времени исполнения с помощью обработчика ошибок.
Когда нужно использовать защитные методики программирования, а когда обработчики ошибок? Ответ зависит от того, насколько часто, по вашему мнению, будет возникать проблема с операторами, которые вы планируете использовать. Если исключение или ошибка времени исполнения будет возникать довольно редко, скажем, менее чем в 25% случаев исполнения данного конкретного кода, то использование обработчика ошибок может оказаться наиболее эффективным способом. Обработчики ошибок также более удобны, если у вас более одного проверяемого условия, и если вы хотите предоставить пользователю различные возможности реакции на ошибку. Однако если существует реальная возможность того, что данный кусок кода будет приводить к ошибкам времени исполнения в более чем 25% случаев его исполнения, то обычно защитная методика программирования является наиболее эффективным способом управления. Как уже было сказано при обсуждении блока кода If 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 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 Catch |
Поместите один блок кода Try 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 |