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

Иерархия исключений. Исключения как замена для goto.

Мы создали новый класс исключений, производный от IOException, потому что потенциальная проблема явно относилась к категории ввода-вывода. Допустим, ситуация имеет более общий характер и для базового класса не существует других очевидных кандидатов, кроме класса Exception. Впрочем, это не совсем верно – лучший выбор существует всегда. Мы настоятельно рекомендуем выбирать в качестве базового не сам класс Exceptlon, а производный от него класс AppllcationException.

Дело в том, что .NET Framework различает исключения, возникшие в результате проблем исполнительной среды (например, нехватки памяти или дискового пространства) и проблем, обусловленных работой вашего приложения. Именно исключения второй категории должны быть производными от AppllcationException, поэтому именно этот класс следует выбирать базовым при определении обобщенных исключений в программе.

Примечание
Учтите, что класс IOException, как и многие стандартные исключения, является произ-водным от Exception, а не от ApplicationException
.

Исполнительная среда помогает сделать следующий шаг. Иерархия исключений расходится на две ветви, показанные на рис. 7.1.

Иллюстрированный самоучитель по Visual Basic .NET › Обработка ошибок в VB.NET › Иерархия исключений. Исключения как замена для goto.
Рис. 7.1. Две основные ветви иерархии исключений

Классы Exceptlon, AppllcationException и SystemException обладают одинаковой функциональностью. Существование трех классов вместо одного – не более чем удобная абстракция, благодаря которой становится проще понять исключения, возникающие в ваших программах.

Исключения как замена для goto

Обработка исключений в сочетании с определением собственных классов исключений позволяет полностью отказаться от использования GoTo. Например, в главе 3 был приведен пример оправданного применения GoTo для прерывания вложенных циклов, когда ошибка происходит во внутреннем цикле. Программист VB.NET в подобной ситуации просто заключает весь цикл в блок Try-Catch, как показано ниже:

Sub Main()
Dim getData As String
Dim i, j As Integer
Dim e As System.IO.IOException
Try
For i = 1 To 10
For j = 1 To 100 Console.WriteC'Type the data, hit the Enter key between " & _
"ZZZ to end: ") getData _
Console.ReadLine() If getData = "ZZZ" Then
e New System.IO.IOException("Data entry ended " & _
"at user request") Throw e Else
' Обработка данных
End If
Next j
Next i
Catch
Console.WriteLinete.Message)
Console. Readline()
End Try
End Sub

В приведенном выше фрагменте выделенные строки нельзя объединить конструкцией следующего вида:

Dim e As New System.IO.IOException("Data entry ended at user request")

Вследствие правил видимости VB.NET объект исключения окажется недоступным в секции Catch.

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