Г. Шилдт - С#4.0 Полное руководство (1160795), страница 77
Текст из файла (страница 77)
Подходящий элемент не найден. Как следует из приведенного вьппе результата, каждый оператор сасс)т реагирует только на свой тип исключения. Вообще говоря, операторы басс)т выполняются по порядку их следования в программе. Но при этом выполнлется только один блок сасс)т, в котором тип исключения совпадает с типом генерируемого исключения. А все остальные блоки сасс]т пропускаются.
Перехват всех исключений Время от времени возникает потребность в перехвате всех исключений независимо от их типа. Для этой цели служит оператор сасс)т, в котором тип и переменная исключения не указываются. Ниже приведена общая форма такого оператора. сагой обработка исключений ) С помощью такой формы создается "универсальный" обработчик всех исключений, перехватываемых в программе. Ниже приведен пример такого "универсального" обработчика исключений. Обратите внимание на то, что он перехватывает и обрабатывает оба исключения, 1пг(ехопСОГЕапдеЕхсербьоп и ШУ14(енузегоЕхсерб1оп, генерируемых в программе. Использовать "универсальный" обработчик исключений.
озьпэ Бузпею; с1авв Ехсоепю5 ( всастс чоьб Маьп () ( // Эдесь массив помет длиннее массива белою. 1пг() п1лпег = ( 4, 8, !6, 32, 64, 128, 256, 512 ); тпт[] белою = ( 2, О, 4, 4, О, 8 )," ГОГ(1ПС 1=01 1 < ПЦЮЕГ.ЬЕПЧС)п 1++) ( сгу Сопво1е.нгтте11пе(пцюег(1] + " / Сепою(1] + " равно пцщег[1]/с)епою[1)); ) сассь ( // "универсальный" перехват. Сопво1е.нгттет ьпе("возникла некоторая исключительная ситуация."); ) ) При выполнении этой программы получается следующий результат. 4 / 2 равно 2 Возникла некоторая исключительная ситуация. Глава 13.
Обработка исключительных ситуаций 413 16 / 4 равно 4 32 ) 4 равно 8 Возникла некоторая иаключительная ситуация. 128 / 8 равно 16 Возникла некотерая исключительная ситуация. Возникла некоторая исключительная ситуация. Применяя "универсальный" перехват, следует иметь в виду, что его блок должен располагаться последним по порядку среди всех блоков баса(т.
Г)РИМЕЧАНИЕ В подавляющем большинстве случаев "универсальный" обработчик исключений не применяется. Как правило, исключения, которые могут быть сгенерированы в коде, обрабатываются по отдельности. Неправильное использование "универсального" обработчика может привести к тому, что ошибки, перехватывавшиеся при тестировании программы, маскируются.
Кроме того, организовать надлежащую обработку всех исключительных ситуаций в одном обработчике не так-то просто. Иными словами, "универсальный" обработчик исключений может оказаться пригодным лишь в особых случаях, например в инструментальном средстве анализа кода во время выполнения. Вложение блоков ~гу Один блок агу может быть вложен в другой. Исключение, генерируемое во внутреннем блоке агу и не перехваченное в соответствующем блоке с асс)г, передается во внешний блок ь ту. В качестве примера ниже приведена программа, в которой исключение 1пбехо ос06напдеЕхсерсьоп перехватывается не во внутреннем, а во внешнем блоке агу.
Использовать вложенный блок агу. цвгпд Бузгешг с1авз Невттгув ( ваат1а чоьб Маьп() ( Здеаь масаив пцшег длиннее массива белою. гпа[) пышет = ( 4, 8, 16, 32, 64, 128, 256, 512 гпа[) белою = ( 2, О, 4, 4, О, 8 ); Ггу ( // внешний блок Ггу бог(1пг 1=0; 1 < пожег.Ьепдг)и 1ь+) ( Ггу ( // вложенный блок Ггу Сопво1е.нгьсеьтпе(пцшег[г) + " / бепош(1) + " равно пышет(г)/бепош(г))г ) пасок (Огч1беВузегоЕхсера1оп) ( Сопво1е.игггеьгпе(Вцепить на нуль нельзя!" ); ) 414 Часть (. Язык С(г сакс)г (1пбехоосогнапдеехсергьоп) ( Сопво1е.игьгеььпе("Подходящий элемент не найден."); Сопво1е.игьсеььпе("Неисправимая ошибка — программа прервана.") ) Выполнение этой программы приводит к следующему результату. 4 2 2 равно 2 Делить на нуль нельзя! 16 2 4 равно 4 32 2 4 равно 8 Делить на нуль нельзя! 128 У 8 равно 16 Подходящий элемент не найден.
Неисправимая ошибка — программа прервана. В данном примере исключение, обрабатываемое во внутреннем блоке сгу и связанное с ошибкой из-за деления на нуль, не мешает дальнейшему выполнению программы. Но ошибка нарушения границ массива, обнаруживаемая во внешнем блоке сгу, приводит к прерыванию программы. Безусловно, приведенный выше пример демонстрирует далеко не единственное основание для применения вложенных блоков с ту, тем не менее из него можно сделать важный общий вьпюд.
Вложенные блоки с ту нередко применяются для обработки различных категорий ошибок разными способами. В частности, одни ошибки считаются неисправимыми и не подлежат исправлению, а другие ошибки незначительны и могут быть обработаны немедленно. Как правило, внешний блок с ту служит для обнаружения.и обработки самых серьезных ошибок, а во внутренних блоках сгу обрабатываются менее серьезные ошибки. Кроме того, внешний блок с ту может стать "универсальным" для тех ошибок, которые не подлежат обработке во внутреннем блоке. Генерирование исключений вручную В приведенных выше примерах перехватывались исключения, генерировавшиеся исполняющей системой автоматически.
Но исключение может быть сгенерировано и вручную с помощью оператора с)ггои. Ниже приведена общая форма такого генерирования: Сьгон ехсергОЬ; где в качестве ехсерсс)Ь должен быть обозначен объект класса исключений, производного от класса Ехсерсйоп. Ниже приведен пример программы, в которой демонстрируется применение оператора с)ггои для генерирования исключения Р1чйг(еВузегоехсерс1оп. Сгенерировать исключение вручную.
овгпэ Зувгешг с1авв ТпгонОешо ( всагвс чо1б Маьп() ( сгу ( Глава 13. Обрабстка исключительных ситуаций 415 Сопво1е.игггеъьпе ("До генерирования исключения. "); Спгон пен Огч1оеВузеговхсерпгоп () 1 саго)1 (Огч18еВузегоЕхсергьоп) ( Сопво1е.яг1геъ1пе("Исключение перехвачено."); ) Сопво1е.иг1геЬгпе("После пары операторов агу/сагсь.") ) ) Вот к какому результату приводит выполнение этой программы. До генерирования исключения.
Исключение перехвачено. После пары операторов Сгу/саес)г. Обратите внимание на то, что исключение Р1ч14)енузегоЕхсерг1оп было сгенерировано с использованием ключевого слова пеи в операторе с)ггоы. Не следует забывать, что в данном случае генерируется конкретный объект, а следовательно, он должен быть создан перед генерированием исключения.
Это означает, что сгенерировать исключение только по его типу нельзя. В данном примере для создания объекта П1ч1г)енузегоЕхсерс1оп был автоматически вызван конструктор, используемый по умолчанию, хотя для генерирования исключений доступны и другие конструкторы. Повторное генерирование исключений Исключение, перехваченное в одном блоке пасс) ь может быль повторно сгенерировано в другом блоке, чтобы быть перехваченным во внешнем блоке сасс)ь Наиболее вероятной причиной для повторного генерирования исключения служит предоставление доступа к исключению нескольким обработчикам.
Допустим, что один обработчик оперирует каким-нибудь одним аспектом исключения, а другой обработчик — другим его аспектом. Для повторного генерирования исключения достаточно указать оператор спгон без сопутствующего выражения, как в приведенной ниже форме. Спгон Не следует, однако, забывать, что когда исключение генерируется повторно, то оно не перехватывается снова тем же самым блоком сасс)ь а передается во внешний блок сасс(ь В приведенном ниже примере программы демонстрируется повторное генерирование исключения. В данном случае генерируется исключение Хпс(ехОпСОЕЕапдеЕхсерг1оп. // Сгенерировать исключение повторно. пв1по Бувгею) с1авв Вегпгон ( ри511с вгаг1с чогс) ОепЕхсерггоп() ( // Здесь массив ппюег длиннее массива г)епою.
гпг(] ппюег = ( 4, 8, 16, 32, 64, 128, 256, 512 ); 1пг() Сеною = ( 2, О, 4, 4, О, 8 )) Гог(гпс 1=0; 1<попел.Велдона; гь+) ( 416 часть (. язык С() сгу ( Сопво1е.игггеьгпе(ппшег(1] + " / белою(1) т " равно пошел(1]/бепош[г)); ) пасс)г [ОгчгбевузегоЕхсерсгоп) ( Сопво1е.иггсеь1пе("Делить на нуль нельзя!"); ) сасс)г (Хпбехоосотнапдекхсерггоп) ( Сопво1е.игтгеЬ1пе("Подходящий элемент не найден."); обгон; // сгенерировать исключение повторно ) ) с1авв Нес)тгонэещо ( всаг1с но16 ма1п() ( ггу ( НеГЬгон.бепкхсерсгоп(); ) сассб(гпбехосГОГНапдеЕхсерсгоп) ( перехватить исключение повторно Сопво1е.иг1сеьтпе("Неисправимая ошибка — программа прервана.") ) ) В этом примере программы ошибки из-за деления на нуль обрабатываются локально в методе еепехсерс1оп (), но ошибка выхода за границы массива генерируется повторно.
В данном случае исключение 1пс)ехопСОЕНапдеЕхсерг1оп обрабатывается в методе Магп () . Использование блока йпа11у Иногда требуется определить кодовый блок, который будет выполняться после выхода из блока сгу/сасс)г. В частности, исключительная ситуация может возникнуть в связи с ошибкой, приводящей к преждевременному возврату из текущего метода. Но в этом методе мог быть открыт файл, который нужно закрыть, или же установлено сетевое соединение, требующее разрывания. Подобные ситуации нередки в программировании, и поэтому для их разрешения в СФ предусмотрен удобный способ; воспользоваться блоком йпа11у.
Для того чтобы указать кодовый блок, который должен выполняться после блока с ту/ с асс)ь достаточно вставить блок йпа 11 у в конце последовательности операторов сгу/сасс)ь Ниже приведена общая форма совместного использования блоков ггу/ сасс)тийпа11у. сгу ( Блок кода, предназначенный для обработки ошибок. ) сагсЬ (Ехсертуре1 ехоб) Обработчик исключения типа Ехсертуре1. Глава 13. Обрабатка исю)ючительиых ситуаций 417 ) саосп (ЕхсерТуре2 ехОЬ) // Обработчик исключения типа ЕхсерТуре2. тапа11у ( // Код завершения обработки исключений.