Иерархия исключений. Исключения как замена для goto.
Мы создали новый класс исключений, производный от IOException, потому что потенциальная проблема явно относилась к категории ввода-вывода. Допустим, ситуация имеет более общий характер и для базового класса не существует других очевидных кандидатов, кроме класса Exception. Впрочем, это не совсем верно – лучший выбор существует всегда. Мы настоятельно рекомендуем выбирать в качестве базового не сам класс Exceptlon, а производный от него класс AppllcationException.
Дело в том, что .NET Framework различает исключения, возникшие в результате проблем исполнительной среды (например, нехватки памяти или дискового пространства) и проблем, обусловленных работой вашего приложения. Именно исключения второй категории должны быть производными от AppllcationException, поэтому именно этот класс следует выбирать базовым при определении обобщенных исключений в программе.
Примечание
Учтите, что класс IOException, как и многие стандартные исключения, является произ-водным от Exception, а не от ApplicationException.
Исполнительная среда помогает сделать следующий шаг. Иерархия исключений расходится на две ветви, показанные на рис. 7.1.
Рис. 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.