Анализ исключений. Наличие нескольких секций Catch.
Следующим шагом должен быть перехват и последующий анализ исключения. Для этого команда Catch приводится к следующему виду:
Catch excep As Exception
(Имя может быть любым, поскольку упоминание в заголовке секции Catch считается объявлением переменной). Теперь объект исключения, на который ссылается ехсер, автоматически заполняется данными.
Например, в следующей секции Catch используется встроенный метод ToString объекта исключения ехсер:
Catch ехсер As Exception Console.WriteLine(excep)
Результат выглядит примерно так:
System.IndexOutOfRangeException: An exception of type_ System.IndexOutOfRangeException was thrown, at Exception_l.Exception!.Main() in C:\Documents and_ Settings\x20\My DocumentsWisual Studio Projects\ConsoleApplication!4\Exception.vb:1ine 6
Из описания видно, что ошибка произошла в строке 6 при обращении к элементу массива. Конечно, если вы не хотите пугать пользователя, выводить эту информацию в окончательной версии программы не рекомендуется, но в процессе отладки она очень полезна.
При знакомстве с этим примером возникает логичный вопрос. Допустим, пользователь ввел имя файла, но метод ProcessFile не может его обработать. Что тогда? Можно ли отличить одно исключение от другого? Как вы вскоре увидите, небольшое усложнение секции Catch позволяет различать исключения по категориям. Более того, в секции Catch можно даже заново инициировать перехваченное исключение командой Throw, чтобы продолжить его обработку.
Наличие нескольких секций Catch
Одной секции Try в VB.NET может соответствовать несколько секций Catch. Каждая секция перехватывает определенную категорию исключений, при этом для идентификации ошибок используются объекты классов, производных от базового класса Exception. Пример:
Sub Main() Dim args() .argument As String Try args = Environment.GetCormandLineArgs() ProcessFile(argsd)) Catch indexProblem As IndexOutOfRangeException Console.WriteLine("ERROR – No file name supplied") Catch ioProblem As System.10.I0Exception Console.WriteLine("ERROR – can't process file named " & args(D) Catch except As Exception ' Прочие исключения End Try Console.WriteLine("Press enter to end") Console. ReadLine() End Sub
В данном примере программа последовательно просматривает все секции Catch, пытаясь найти совпадение. Если пользователь не указал имя файла, совпадение будет найдено в первой секции. Вторая секция должна совпадать в том случае, если при вызове ProcessFile не удастся обработать файл (возможные причины рассматриваются далее). Если первые два случая не подошли, остальные исключения перехватываются последней секцией Catch.
Примечание
Обнаружив подходящую секцию Catch, VB выполняет ее. Код других секций Catch при этом не выполняется.