Подготовка к структурной обработке исключений
Прежде чем переходить к примерам, демонстрирующим обработку исключений на практике, необходимо познакомиться с некоторыми обстоятельствами. Во-первых, при структурной обработке исключений в программу включается дополнительная ветвь, которая автоматически выполняется при возникновении каких-либо аварийных ситуаций. Кроме того, при обработке исключений VB.NET автоматически создает объект, содержащий информацию об ошибке.
Когда в программе происходит исключение, встроенный механизм начинает искать обработчик, подходящий для данного объекта исключения (то есть для конкретной причины ошибки). Речь идет не о наборе GoTo, запутывающих логику программы, – обработка исключения больше напоминает запасную дорогу, идущую параллельно главной магистрали и связанную с ней несколькими переездами – настоящей мечте любого водителя, попавшего в пробку. Если в программе что-то пойдет не так, управление автоматически передается ветви, содержащей логику обработки исключений (если, конечно, вы ее запрограммировали). После этого исключение либо рассматривается одним из обработчиков, либо передается дальше по цепочке.
В VB.NET для обработки исключений существует синтаксическая конструкция, называемая блоком Try-Catch. Допустим, у нас имеется консольное приложение ProcessFile. Предполагается, что пользователь запускает его в режиме командной строки командой вида:
ProcessFile имя_файла
Имя файла передается в виде параметра. Как это обычно бывает, пользователи будут делать все, чтобы сбить бедную программу с толку. В частности, они могут:
- забыть о вводе имени файла;
- ввести имя несуществующего файла;
- ввести имя файла, недоступного для выполнения данной операции.
Программа должна быть написана так, чтобы учитывать все возможные ошибки со стороны пользователя. Ниже приведен пример простого блока Try-Catch, который может входить в приложение ProcessFile:
Module Exceptionl Sub Main() Dim args() As String Try args = Environment.GetCommandLineArgs() ProcessFile(argsd)) Catch Console.WriteLine("ERROR") End Try Console.WriteLine("Press enter to end") Console. ReadLine() End Sub Sub ProcessFiletByVal fileName As String) ' Обработка файла Console.WriteLine("Am processing " & fName) End Sub End Module
Секция Try блока Try-Catch содержит "правильный" код – в данном примере это вызов ProcessFile (вызов Environment.GetCommandLingArgs() заключен в секцию Try, потому что он тоже может инициировать исключение – например, если ваша программа работает на платформе, не поддерживающей передачи аргументов в командной строке).
Секция Catch в блоке Try-Catch необходима, потому что некоторые невнимательные пользователи не обращают внимания на указания. Если в приведенном фрагменте пользователь забывает ввести имя файла, программа пытается обратиться к имени файла, что приводит к исключению IndexOutOfRangeExceptlon, поскольку элемент с указанным индексом отсутствует в файле. При возникновении исключения управление передается в дополнительную ветвь, то есть в блок Catch, который в нашем примере просто выводит строку ERROR в консольном окне.
Примечание
Из блока Try, как и из других управляющих конструкций VB.NET (таких, как циклы For и Do), можно выйти немедленно командой Exit Try. Впрочем, применение Exit Try обычно считается проявлением плохого стиля программирования.