Иллюстрированный самоучитель по Visual Basic .NET

Анализ исключений. Наличие нескольких секций 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 при этом не выполняется
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.