Г. Шилдт - С#4.0 Полное руководство (1160795), страница 80
Текст из файла (страница 80)
Перехват исключений производных классов При попытке перехватить типы исключений, относящихся как к базовым, так и к производным классам, следует особенно внимательно соблюдать порядок следования операторов сатсЬ, поскольку перехват исключения базового класса будет совпадать с перехватом исключений любых его производных классов.
Например, класс Ехсерт1оп является базовым для всех исключений, и поэтому вместе с исключением типа Ехсер та оп могут быть перехвачены и все остальные исключения производных от него классов. Конечно, для более четкого перехвата всех исключений можно воспользоваться упоминавшейся ранее формой оператора сатс Ь без указания конкретного типа исключения. Но вопрос перехвата исключений производных классов становится весьма актуальным и в других ситуациях, особенно при создании собственных исключений.
Если требуется перехватывать исключения базового и производного классов, то первым по порядку должен следовать оператор сатсЬ, перехватывающий исключение производного класса. Это правило необходимо соблюдать потому, что при перехвате исключения базового класса будут также перехвачены исключения всех производных от него классов. Правда, это правило соблюдается автоматически: если первым расположить в коде оператор сассЬ, перехватывающий исключение базового класса, то во время компиляции этого кода будет выдано сообщение об ошибке. В приведенном ниже примере программы создаются два класса исключений: ЕхсертА и ЕхсертВ. Класс Ехсертй является производным от класса Ехсерт1оп, а класс Ехсерт — производным от класса Ексерсй. Затем в программе генерируются исключения каждого типа.
Ради краткости в классах специальных исключений предоставляется только один конструктор, принимающий символьную строку, описывающую исключение. Но при разработке программ коммерческого назначения в классах специальных исключений обычно требуется предоставлять все четыре конструктора, определяемых в классе Ехсерсэоп. !! Исключения производных классов должны появляться до !! исключений базового класса. сатпд Зуатею; Создать класс исключения. с1азз Ехсерть : Ехсерт1оп ( роЬ1тс ехсертА(вттгпс зтт) : Ьаве(атт) ( ) Глава 13. Обработка исключительных ситуаций 427 рпЬ11с очеггсг)е ягг1пэ Тозггспо() ( гегигп Меяяаое; ) Уl Создать класс исхлючения, производный от класса ЕхсерСА.
с1аяя ЕхсерСВ : Ехсергл ( рпЬ11с Ехсергв(ягг1по ягг) : Ьазе(агг) ( ) роЬ11с очегг1ое ягглпо Тозгглпд() ( гегигп Меяяаое; ) ) с1аяя ОгоегнаССегя ягаС1с чо1с) Ма1п() ( бог(1пс х = 0; х < 3; хт+) ( сгу ( 11(я==о) Сьгон пен Ехсергл("Перехват исключения типа ЕхсерСА") е1яе гт(х==1) олсон пен ЕхсерСВ("Перехват исключения типа ЕхсерСВ"); е1яе СЬгон пен ЕхсерС1оп(); ) сагсЬ (ЕхсерСВ ехс) ( Сопяо1е.нглгеЬ1пе(ехс); ) сагсл (Ехсергл ехс) ( Сопяо1е.иг1Сеэвпе(ехс); ) саСсЬ (Ехсергтоп ехс) ( Сопяо1е.
Иг1гевспе (ах с); ) ) ) ) Вот к какому результату приводит выполнение этой программы. Перехват исключения типа ЕхсерСА. Перехват исключения типа ЕхсерСВ. Буягею.Ехсерггоп: Выдано исключение типа "Яуягею.Ехсерггоп". я Огдегнаггегя.налп() я <имя файла>:строка Зб Обратите внимание на порядок следования операторов саСсЬ. Именно в таком порядке они и должны выполняться.
Класс ехсерсВ является производным от класса ЕхсерСА, поэтому исклн)чение типа ЕхсерСВ должно перехватываться до исключения типа ЕхсерСА. Аналогично, исключение типа ЕхсерС1оп (т.е. базового класса для всех исключений) должно перехватываться последним. Для того чтобы убедиться в этом, измените порядок следования операторов саСсЬ. В итоге это приведет к ошибке во время компиляции.
Полезным примером использования оператора саСсЬ, перехватывающего исключения базового класса, служит перехват всей категории исключений. Допустим, что создается ряд исключений для управления некоторым устройством. Если сделать их классы производными от общего базового класса, то в тех приложениях, где необязательно выяснять конкретную причину возникшей ошибки, достаточно перехватывать исключение базового класса и тем самым исключить ненужное дублирование кода.
428 Часть!. Язык С() Применение ключевых слов спес)сей и ипсЬес)сес В С() имеется специальное средство, связанное с генерированием исключений, возникающих при переполнении в арифметических вычислениях. Как вам должно быть уже известно, результаты некоторых видов арифметических вычислений могут превышать диапазон представления чисел для типа данных, используемого в вычислении. В этом случае происходит так называемое переполнение. Рассмотрим в качестве примера следующий фрагмент кода. Ьусе а, Ь, гевн1Ю а = 127; Ь = 127," гево11 = (Ьусе) (а * Ь) В этом коде произведение значений переменных а и Ь превышает диапазон представления чисел для типа Ьусе.
Следовательно, результат вычисления данного выражения приводит к переполнению для типа данных, сохраняемого в переменнои гевп1Ь. В С(( допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов сЬес)сед и ппсЬесхед. Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово сЬес)(ед, а если требуется проигнорировать переполнение — ключевое слово ппсЬесхед. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения.
У ключевого слова сьескед имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она называется операп(орной. А в другой форме проверяется блок операторов, и поэтому она называется блатной. Ниже приведены обе формы: спесхед (вьравеяие) спескед ( !/ проверяемые операторы ) где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение Отег()оыехсерсйоп. У ключевого слова ппсЬесхед также имеются две общие формы.
В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов: ипспесхед (выражение) опспесхед ( операторы, вля которых переполнение игноРиРуется ) где выражение обозначает конкретное выражение, при вычислении которого переполнение игнорируется. Если же в непроверяемом выражении происходит переполнение, то результат его вычисления усекается. Глава 13.
Обработка исекочительных ситуаций 429 Ниже приведен пример программы, в котором демонстрируется применение ключевых слов сйес)сед и цпспес)гед. О Продемонстрировать применение ключевых слов слескед и цпсьескед. ця1пд Яувсепп с1аяя Слескедоеюо ( ясастс чогд Маго() ( Ьуге а, Ь; Ьусе геяц1Г; а = 1271 Ь = 127; ггу ( геяц1Г = цпслесьед((ЬУГе)(а * Ь)); Сопяо1е.нгьтетйпе("Непроверенный на переполнение результат: геяц1Г) ) геяц1Г = слескед((Ьуге)(а * Ь))г О зта операция приводит к исключительной ситуации Сопяо1е.нг1се11пе("Проверенный на переполнение результат: геяц1с); // не подлежит выполнению ) сассь (Очегт1онЕхсерсьоп ехс) ( сопяо1е.иг1геььпе(ехс); ) ) ) При выполнении этой программы получается следующий результат.
Непроверенный на переполнение результат: 1 Буясеп.бчегт1онЕхсерс1оп: Переполнение в результате выполнения арифметической операции. в Слесхедбето.маьп() в <имя файла>:строка 20 Как видите, результат вычисления непроверяемого выражения был усечен. А вычисление проверяемого выражения привело к исключительной ситуации. В представленном выше примере программы было продемонстрировано применение ключевых слов спес)гед и цпсйес)гед в одном выражении. А в следующем примере программы показывается, каким образом проверяется и не проверяется на переполнение целый блок операторов. Ф // Продемонстрировать применение ключевых слов сьескед // и цпслескед в блоке операторов. цялпо Яуясею; с1аяя СлескедВ1осья ( ясасгс чоюд Ма1п () ( Ьуге а, Ь; Ьусе геяц1гг а = 127; Ь = 127; 430 Часть (.
Язык С() ггу ( цпсьесхеп ( а = 127; Ь = 127( геяц1Г = цпсьескег(((Ьусе)(а * Ь)); Сопяо1е.нгтсе11пе("Непроверенный на переполнение результат: геяц1г) г а = 125; Ь=5; геяц1Г = ипсьескео ((Ьусе) (а * Ь) ) ) Сопяо1е.иг1се11пе("Непроверенный на переполнение результат." геяц1г)т а = 127( Ъ = 127; геяц11 = сьесхег(( Сопяо1е.нггсещпе ) ) сассь (ОчегГ1онЕхсерсгоп ехс) ( Сопяо1е.игьсеЬтпе(ехс)г ) Результат выполнения этой программы приведен ниже. Непроверенный на переполнение результат: 1 Непроверенный на переполнение результат: 113 Проверенный на переполнение результат: 14 Буясею.очегГ1онЕхсерстоп: Переполнение в результате выпопнения арифметической операции.