Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 147
Текст из файла (страница 147)
13.5.3. Связывание исключительных ситуаций с обработчиками Возбуждение исключительной ситуации происходит довольно просто. Экземпляр класса исключительной ситуации является операнлом оператора г)эгон. Определим исключительную ситуацию с именем МуЕхсерг1оп следуюшим образом: о1авв МуЕхсерсдог. вхсвпав Ехсерс'оп риЪ11с МуЕхсерсьоп() ( рпЪ11о МуЕхсерГ1оп(ЯГг1па щевваде) ( вирег (желваке)г ) Эту исключительную ситуацию можно возбудить оператором КЬгон пен МуЕхсерсдоп(); Экземпляр исключительной ситуации лля оператора г)эгон создается отдельно от оператора ГЬгон, как показано ниже муехсерг1оп шуЕхсергдопОЪ)есг = пен Муехсергдоп(); Г)эгон шуЕхсерг1опОЪзессг Один из двух конструкторов, включенных в наш новый класс.
не имеет параметров, а другой имеет параметр в виде объекта типа Ягг1пд, который он передает в суперкласс (Ехсерс1оп) лля отображения. Таким образом, наша новая исключительная ситуация может быть возбуждена следуюшим образом: спгон пен МуЕхсерс1оп (" сообщение, определяющее местоположение ошибки" ) Связывание исключительных ситуаций с обработчиками в языке )ача менее сложно, чем в языке С++. Если исключительная ситуация возбудилась в составном операторе конструкции агу, она связывается с первым обработчиком (функцией оагоЬ), непосредственно следующим за оператором ггу. параметр которого принадлежит тому же классу, что и объект возбужденной исключительной ситуации, или является прелком по отношению к нему.
Если найден подходящий обработчик, оператор г)эгон связывается с иим, и этот обработчик выполняется. Глава 13. Обработка исключительных ситуаций $68 Исключительные ситуации могут быть обработаны. а затем снова возбужлены. если включить оператор кззкои без операнда в конец обработчика. Повторно возбужденная исключительная ситуация не будет обработана той же конструкцией кку, которой она первоначально была возбуждена. так что зацикливания не возникает. Это повторное возбуждение обычно осушествляется, когда следует выполнить некоторое локальное действие, а затем — дальнейшую обработку вложенным оператором кку или вызываюшим модулем. Оператор сЗзкси в обработчике также может возбудить исключительную ситуацию, отличаюш>юся от той.
что передала управление лаиному разработчику: олив исключительная ситуация может возбуждать другую. 13.5.4. Продолжение выполнения программы Обработчик, найденный в последовательности обработчиков из конструкции цку, выполняется, а программа продолжается с оператора. следуюшего за конструкцией Кку. Если обработчик не обнаружен. производится поиск обработчиков во вложенных конструкциях кку, начиная с самого нижнего уровня. Если в результате этого процесса не будет найден ни один обработчик, исключительная ситуация передается в модуль. вызвавший данный метод. Если вызов метода осушествлялся из оператора кку.
поиск обработчика продолжается в наборе обработчиков. присоединенном к данной конструкции. Передача исключительной ситуации продолжается. пока не будет выявлен первоначальный модуль, вызвавший функцию, в которой возникла исключительная ситуация. В прикладной программе этим модулем является модуль маЗп. Если полхоляший обработчик не найден нигде, выполнение программы завершается.
Во многих случаях обработчики исключительных ситуаций содержат оператор кевцкп, чтобы завершить выполнение метода. в котором возникла исключительная ситуация. Для того чтобы убедиться в том. что исключительные ситуации, которые могут быть возбуждены в операторе кку, всегда обрабатываются некоторым методом, используется специальный обработчик, подходяший лля всех исключительных ситуаций. производных от класса ехсерс Гоп, с определением обработчика с параметром типа ехсерс оп, как показано ниже: сапсЬ (Ехсертзоп сепегусОЬэес) ( Поскольку имя класса всегда соответствует самому себе или другому классу-предку, любой класс, производный от класса Ех серг ' оп, соответствует исключительной ситуации Ехсерс хоп. Конечно, такой обработчик лолжен всегда помешаться в конец списка, при этом он блокирует использование любого обработчика.
следуюшего за ним а конструкции кку. Таким образом, поиск подходящих обработчиков выполняется последовательно и заканчивается. когда соответствие найлено. Объект, являющийся параметром обработчика исключительной ситуации. не так бесполезен, как это могло показаться. При выполнении программы система поддержки выполнения программ языка 1ача хранит в памяти имя класса каждого объекта в программе.
Метод десС1авл можно использовать лля того. чтобы получить объект, храняший имя класса, который в свою очередь получен методом оесИаже. Таким образом, можно получить имя класса фактического параметра оператора еззкои, вызвавшего выполнение обработчика. Для приведенного выше обработчика это осушествляется следующим образом: $6Р 13.5. Обработка исключительных ситуаций в языке Зача „"епег1сОВ)ест.дес01авв().оет)чаже() Сообшснне.
связанное с объектом. являющимся параметром, которое может быть сошано в конструкторе. получено с помошью оператора П.. СГСС0Ь„'ЕСС.СЕ")ЧЕЯВадЕ() 13.5.5. Другие проектные рензение Оператор сегоня размешается в программах на языке )ача в том же месте, что и спецификация е)згон в программах на языке С++.
Однако семантика оператора е)эгона значите. ~ьио отличается от семантики оператора кЬгон в языке С++. Появление имени исключительной ситуации в операторе вагона в методе на языке )ача указывает на то, что данный класс исключительных ситуаций или любой из производных от него классов может быть возбужден этим методом. Например, если в методе ) катано. по он может возбулить исключительную ситуацию 10Ехсергъоп, это означас и чго оп может возбудить объект класса 10Ехсерс1оп или обьект любого из производныч оз 0 хсерс1оп классов, такого как ЕОГЕхсерс1оп.
Исьлн1ЧнтЕЛЬНЫЕ Ситуации из класСов Еггог и Кцпг1меЕхсерт1оп, а также произволныь от них классов называются непровереннымн исключительными ситуациянн (цпслес) ег( ехсерпопз). Все другие исключения называются проверенными исклю° ппельнымн ситуациямн (с)зес)гес( ехсерйопз). Непроверенные исключительные ситуаьци никогда не анализируются компилятором. Однако компилятор гарантирует, что все ,"1веренные исключительные ситуации, которые могут возбуждаться методом, либо пе~нслсны в операторе кагана, либо обрабатываются в методе.
Причина, по которой ассы .'- гсг и Ецп" 1жеЕхсерс1оп, а также производные от них являются непроаерс .ными. заключается в том, что их может возбудить любой метод. В операторе кпгонв, принадлежашем методу, нельзя объявить больше исключитслычзч сигуаций. чем в методе, который он замешает, хотя меньше объявить можно. Талин образом, если в некоем методе нет оператора сегоня, то его не может иметь ни один чс1од.
замешаюший ланный. Метод может возбуждать любую исключительную сиз)линю. указанную в его операторе погона, а также любую исключительную ситуацию, производную от нее. Если метод не возбуждает непосредственно конкретную исключительн) ю ситуацию, но вызывает другой метод, который мог бы возбудить зту ситуацию, данная исключительная ситуация должна быть указана в его операторе кгзгонв. По этой причине в примере, приведенном ниже, в операторе сегоня заголовка метода пц '. зп .1ет. используюшего метод геаг(Ь1пе.
должна быть указана исключительная ситуация 10Ехсергъоп. Метод. вызываюший другой метод, в операторе вагона которого перечислены конкретные проверенные исключительные ситуации, имеет три возможности для обработки эзих исключительных ситуаций. Во-первых, он может перехватывать исключительную ситуацию и обрабатывать ее сам. Во-вторых, он может перехватывать исключительную ситуацию и возбуждать другую исключительную ситуацию, указанную в его операторе к)згонв. В-третьих, он мог бы объявить исключительную ситуацию в своем операторе к)эгона и не обрабатывать ее, а передавать во вложенный оператор кгу, если он существует.
или в модуль, вызвавший данный метод, если вложенного оператора Егу в методе нет. Глава 13. Обработка исключительных ситуаций 570 Обработчиков исключительных ситуаций по умолчанию в языке 1ача нет, и заблокировать исключительные ситуации невозможно. 13.5.6. Прнмер Ниже приводится класс на языке )ача с возможностями, которыми обладала программа на языке С++ из раздела 13.4: зароке 1ача.1о.*г // Определение исключительной ситуации, // относящейся к обнаружению конца входных данных о1авв Недагзче1присЕхсергзоп ажсаЫв Ехсергзоп ( риЬ11о Иедас1че1прцГЕхсерс1оп() ( Яувгеш.оцс.рг1пс1п("достигнут конец входных данных")> ) //* конец конструктора ) //* конец класса Хе9аг1че1прцСЕхсерс1оп с1ава бгабееззс ( Епе пенбгас(е, 1пбех, 11ш1г 1, 11ш1с 2( Епе () 1гес( = (О, О, О, О, О, О, О, О, О, О)' чоИ Ьц11б01вг() ЕЬгоив 1ОЕхсерг1оп ( // Ввод: список целых чисел, представляющих собой ранги, // за которьдчи следует отрицательное число // Вывод: распределение оценок в процентах по каждому из // диапазонов 0-9,10-19, ..., 90-100 Оаса1прцсЯГгеаш 1п = пен Оаса1прцГЯсгеаш(Яувсеш.
1п); агу ( нЬ11а (Ггце) яузгеш. оцс. ргзпс1п (" Пожалуйста, введите оценку" ); пенбгас(е = 1пседег.рагзе1пг(1п.геаббзпе() ); ЕГ (пенбгабе < 0) ЕЬгои паи ))е9аг1че1прцсЕхсергзоп(); 1пбех = пенбгас(е / 10; сгу йгег([1пбех)++г //* конец внутреннего оператора Сгу сассЬ(Аггау1пг(ехОцгОГВоцпс(вЕхсерг1оп) ( Ег (пенбгабе == 100) ангес( [9)++; а1ва Яувсеш.оцс.ргзпс1п("Ошибка - новая оценка: + пенбгабе + "выходит за пределы допустимого диапазона)г ) //* конец функции сассЬ (Аггау1пбех...
) //* конец цикла нЬ11е (Ггце) //* конец внешнего оператора Ггу сагсЬ(ие9асзче1прцсЕхсерсзоп) ( 13.5. Обработка исключительных ситуаций в языке 3ача яувгеа. оцг. ргдпг1п ("1пГраницы ЧастотыМ) ) Еог (1пс(ех = 0; дпс(ех < 10; дпс(ех++) ( 11тфг 1 = 10 * дпс(ех; 1лзс 2 = 1лзд 1+ 9; ЕЕ (дпс(ех == 9) 1лдг 2 = 100; яуасеи.огас.ргдпс1п("" + 1лдс 1 + " — " + 11вфг 2 + " " ь 1геЧ(дпс(ех)) //* конец цикла 1ог(1пс(ех = 0; //* конец функции сапс)т ((Чедас1че1пригЕхсерсдоп ) //* конец метода Ьц11б01вс В программе определена исключительная ситуация ))еоас1че1прнСЕхсерсдоп, возникающая при вводе отрицательного числа.