Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 76
Текст из файла (страница 76)
Подходящий элемент не найден. Как следует из приведенного выше результата, каждый оператор сагсп реагирует только на свой тип исключения. Вообще говоря, операторы сагой выполняются по порядку их следования в программе. Но выполняется только один блок сассп, в котором тип исключения совпадает с типом генерируемого исключения. А все остальные блоки саср)т пропускаются. 398 Часть ). Язык С№ Перехват всех исключений Время от времени возникает потребность в перехвате всех исключений независимо от их типа. Для этой цели служит оператор сассв, в котором тип и переменная исключения ие указываются. Ниже приведена общая форма такого оператора. саксо ( // обработка исключений ) С помощью такой формы создается "универсальный" обработчик всех исключений, перехватываемых в программе.
Ниже приведен пример такого "универсального" обработчика исключений. Обратите внимание иа то, что ои перехватьваег и обрабатывает оба исключения, тпбехспсоЕиапдеехсерс1оп и 01У1т]еВуЕеговхсерг1оп, генерируемых в программе. // Использовать "универсальный" обработчик исключений. цзьпч эувкеют с1азэ Ехспеюо5 ( эсак1с то1б Иаьп() ( // здесь массив пцюег длиннее массива белою. ьпк[) ппюег = ( 4, 8, 16, 32, 64, 128, 256, 512 )т 1пг[) с(епою = ( 2, О, 4, 4, О, 8 )) Гог(1пс 1=0; 1 < пцюег.Ьепдтпт 1++) ( сгу ( Сопяо1е.ыгьсевьпе(ппюег(1] + " / " бепою[1] ь " равно " + ппюег[1]/белою[1])) ) саксп ( // "универсальный" перехват. Сопао1е.ыг1кетьпе( "Возникла некоторая исключительная ситуация."); ) При выполнении этой программы получается следующий результат: 4 / 2 равно 2 Возникла некоторая исключительная ситуация.
16 / 4 равно 4 32 / 4 равно 8 Возникла некоторая исключительная ситуация. 128 / 8 равно 16 Возникла некоторая исключительная ситуация. Возникла некоторая исключительная ситуация. Применяя "универсальный" перехват, следует иметь в виду, что его блок должен располагаться последним по порядку среди всех блоков пасс(т. Глава 13. Обработка исключительных ситуаций 399 Ня заметку! В подавляющем большинстве случаев "универсальный" обработчик исключений не применяется. Как правило, исключения, которые могут бьапь сгенерированы в коде, обрабатываются по отдельности.
Неправильное использование "универсального" обработчи ха может привестли к тому, что ошибки, перехватывавшиеся при тестировании программы, маскируются. Кроме того, организовать надлежащую обработку всех исключительных ситуаций в одном обработчике не так-то просто. Оными словами, "универсальный" обработчик исклнтчений можетл оказаться пригодным лишь в особых случаях, например в инструментальном средстве анализа кода во время выполнения. Вложение блоков ~гу Один блок сгу может быть вложен в другой. Исключение, генерируемое во внутреннем блоке сгу и не перехваченное в соответствующем блоке сато)т, передается во внешний блок сгу.
В качестве примера ниже приведена программа, в которой исключение 1пбехбпСОЙПапденхсерт1оп перехватывается не во внутреннем, а во внешнем блоке агу. // Использовать вложенный блок лгу. пзапч Яузсели с1азз Незктгуз ( зкакус чо1б Маги() ( // Здесь массив ппвег длиннее массива белов. 1пк[] ппвег = ( 4, 8, 16, 32, 64, 128, 256, 512 ); тлю [] бетюв = ( 2, О, 4, 4, О, 8 )т лгу ( О внешний блок лгу тог(1пг к=от г < повес.Беловат 1++) ( лгу ( // вложенный блок Ггу Сопзо1е.нг1ке11пе(ппвег[1] + " / " + депеш[1] + " равно " + пшлег [1] /белов [1] ); пасси (01ч1бевуаегоехсерс1оп) ( Сопзо1е.нг1кегнпе("Делить на нуль нельзя!"); ) ) сасс)т (1пбехбпкбтхапоекхсерс1оп) ( Сопзо1е.нг1се11пе("Подходящий элемент не найден.")1 Сопзо1е.нг1се11пе("Неисправимая ошибка — программа прервана.") ) ) ) Выполнение этой программы приводит к следующему результату: 4 / 2 равно 2 Делить на нуль нельзя! 16 / 4 равно 4 32 / 4 равно 8 400 часть (.
((змк Сз Делить на нуль нельзя! 128 / 8 равно 16 Подходяший элемент не найден. Неисправимая ошибка — программа прервана. В данном примере исключение, обрабатываемое во внутреннем блоке г гу и связанное с ошибкой из-за деления на нуль, не мешает дальнейшему выполнению программы. Но ошибка нарушения границ массива, обнаруживаемая во внешнем блоке сгу, приводит к прерыванию программы. Безусловно, приведенный выше пример демонстрирует далеко не единственную причину для применения вложенных блоков сгу, тем не менее из него можно сделать важный общий вывод. Вложенные блоки ггу нередко применяются для обработки различных категорий ошибок разными способами. В частности, одни ошибки считаются неисправимыми и не подлежат исправлению, а другие ошибки незначительны и могут быть обработаны немедленно. Как правило, внешний блок Ету служит для обнаружения и обработки самых серьезных ошибок, а во внутренних блоках ггу обрабатываются менее серьезные ошибки.
Кроме того, внешний блок сгу может стать "универсальным" для тех ошибок, которые не подлежат обработке во внутреннем блоке. Генерирование исключений вручную В приведенных выше примерах перехватывались исключения, генерировавшиеся исполняющей системой автоматически. Но исключение может быть сгенерировано и вручную с помощью оператора Ейгои. Ниже приведена общая форма такого генерирования. спгон ехсерсОЬ) где в качестве ехсерго(2 должен быть обозначен объект класса исключений, производного от класса Ехсерсуоп.
Ниже приведен пример программы, в которой демонстрируется применение оператоь ра Гогом для генерирования исключения Р1у1с(евузегокхсерс1оп. // Сгенерировать исключение вручную. паунд Яувгеш; с1ава тьгоноешо ( асасьс чо1Н Мауп() ( сгу ( Сопао1е.Игугеььпе("До генерирования исключения."); Гьгон пен Оьчтпевугегокхсергьоп()) ) савой (Пьн1с)евузегоЕхсерс1оп) ( Сопзо1е.игьгецвпе("Исключение перехвачено."); ) Сопзо1е.Игьгеььпе("После пары операторов Ггу/сагой.") ) ) Вот к какому результату приводит выполнение этой программы: Глава [3. Обработка исключительных ситуаций 401 До генерирования исключения.
Исключение перехвачено. После пари операторов Сгу/саСсв. Обратите внимание па то, что исключение П1у14[евузегокхсеркйоп было сгенерировано с использованием ключевого слова пен в операторе Слгсн. Не следует забывать, что в данном случае генерируется конкретный объект, а следовательно, ои должен быть создан перед геиерироваиием исключения. Это означает, что сгенерировать исключение только тю его титгу нельзя. В данном примере для создания объекта осчкевнузнгпексврс: пп был автоматически вызван конструктор, используемый по умолчанию, хотя для генерирования исключеиий доступны и другие конструкторы.
Повторное генерирование исключений Исключение, перехваченное в одном блоке сасс)т, может быть повторно сгеиерировано в другом блоке, чтобы быть перехваченным во внешнем блоке сассп. Наиболее вероятит[й причиной для повторного генерирования исключения служит предоставление доступа к исключению нескольким обработчикам. Допустим, что один обработчик оперирует каким-нибудь одним аспектом исключения, а другой обработчик — другим его аспектом. Для повторного генерирования исключения достаточно указать оператор соком без сопутствующего выражения, как в приведенной ниже форме. слгон Не следует, однако, забывать, что когда исключение генерируется повторно, то оио ие перехватывается снова тем же самым блоком сассп, а передается во внешний блок сасс) ь В приведенном ниже примере программы демонстрируется повторное генерирование исключеиия. В даииом случае генерируется исключение 1п<(ехОнСОгкапоеихсерС1оп.
// Сгенерировать исключение повторно. пяспд Яуякевт с1аяя Кеклгон ( рпп11с якаС1с тост( БепЕхсеркаоп() ( // Здесь массив ппвег длиннее массива г(апов. гпС[[ ппвег = ( 4, 8, 16, 32, 64, 128, 256, 512 )т апС() с(апов = ( 2, О, 4, 4, О, 8 ); лог(ьпс 1=04 1<ппвег.ьепдкит 1++) ( ( Сопяо1е.ИггСеьвпе(ппвег[г) + " / " 4 т(епов[1[ + " равно " + навет[1[/г(апов[с))т ) сагси (О1тгпевузегоЕхсереаоп) ( Сопяо1е.иг1Сеъспе("Делить на нуль нельзя!")т саксп (1пг(ехопгогкапдеЕхсергсоп) ( Сопяо1е.Иг1Сет апе("Подходящий зпемент не найден.")т Сигонт // сгенерировать исключение повторно ) ) 402 часть!.
язык Сз с1аэз Кепьгонпешо ( всасьс чотб ма1п 0 ( сгу ( Кеппгои.пепЕксерп1оп(); сассл(1пбехонсогаапчеексерс1оп) ( // перехватить исключение повторно Сопво1е.игтпепхпе("Неисправимая ошибка — программа прервана.") ) ) ) В этом примере программы ошибки из-за деления на нуль обрабатываются локально в методе Бепкхсерг1оп И, но ошибка выхода за границы массива генерируется повторно. В данном случае исключение 1пбехООСОТНапдекхсерг1оп обрабатывается в методе Мазп () .