Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 146
Текст из файла (страница 146)
Если тип Т является классом, -соответствующим" является обработчик, параметр которого имеет тип Т, или любой класс, являющийся предком класса Т. Существуют более запутанные ситуации, в которых выражение г)згсн соответствует формальному параметру. но здесь они не рассматриваются. Исключительная ситуация, возбужденная конструкцией ггу, приводит к немедленному завершению выполнения кода в данной конструкции агу. Поиск соответствующего обработчика начинается с обработчика, непосредственно следующего за конструкцией Сгу, н выполняется последовательно, пока не будет найлен подходящий обработчик. Это означает, что если некоторый другой подходящий обработчик предшествует обработчику, точно соответствующему данному выражению сйгон, то точно соответствующий обработчик не будет использован.
Если в программе есть оператор сацсЬ с зллипсисом в качестве формального параметра, он булат полходить лля любого выражения гЬгон. так что бесполезно помешать такие операторы сассЬ где угодно, кроме конца списка обработчиков. Исключительные ситуации обрабатываются локально, только если соответствующий обработчик также является локальным. Если не найден ни один подходящий локальный обработчик, исключительная ситуация передается в модуль, вызвавший функцию, в которой эта ситуация возникла.
Если во всей программе не найден ни олин подходящий обработчик, то выполнение программы завершается. Глава 13. Обработка исключительных ситуаций 13.4.3. Продолжение выполнения программы После выполнения обработчика управление переходит к первому оператору. следующему за конструкцией цку (оператору, находящемуся непосредственно после последнего обработчика в последовательности обработчиков).
Обработчик может повторно возбудить исключительную ситуацию с помощью оператора ц)зкон. не содержащего выражения. В этом случае такая исключительная ситуация передается в вызывающий модуль. 13.4.4. Другие проектные решения В контексте вопросов разработки языка. перечисленных в разделе!3.1.2, обработка исключительных ситуаций в языке является довольно простой. Существуют только определенные пользователем исключительные ситуации, и они не указываются (хотя могут быть объявлены как новые классы). Нет обработчиков по умолчанию, которые были бы предназначены для обработки исключительных ситуаций. обнаруживаемых системой.
Исключительные ситуации нельзя заблокировать. Функция в языке С++ перечисляет типы исключительных ситуаций (типы выражений с)эком), которые могут возникать. Это осуществляется с помощью приписывания зарезервированного слова с)звон, за которым в скобках следует список этих типов. к заголовку функции. Например, заголовок функции дпс бцп() с)звон (дпц, аЬак*] ( ...
1 указывает, что функция бцп может возбудить исключительные ситуации типа дпц или сЬак*, и никакие другие. Если типы в операторе ц)звон являются классами, то функция может возбудить любую исключительную ситуацию. производную от перечисленных классов. Если заголовок функции имеет оператор Итон. и эта функция возбуждает исключительную ситуацию, не указанную в списке из оператора СЬкон и не являющуюся производной от класса, указанного там, то возникает фатальная ошибка.
Список типов может быть пустым. Это означает. что функция не возбуждает ни одной исключительной ситуации. Если в заголовке функции нет спецификации ц)звон, то функция может возбуждать любую исключительную ситуацию. Список типов исключительных ситуаций не является частью типа функции. Когда исключительная ситуация завершает выполнение конструкции цку, все автоматические и динамические переменные, помещенные в стеке и динамической памяти кодом, выполнявшим эту конструкцию до возникновения исключительной ситуации, удаляются из памяти.
Следовательно, обработчик никогда не сможет получить доступ к этим переменным. 13.4.5. Пример Следующий пример имеет тот же смысл, что и предыдущие, и использует обработку исключительных ситуаций, как и программа на языке Рь/1, приведенная в разделе 13.2.5. Этот код определяет распределение входных оценок с помощью массивов счетчиков для десяти категорий оценок.
Недопустимые оценки распознаются с помощью проверки неверных индексов, используемой при увеличении выбранного счетчика. 1ЗА. Обработка исключительных ситуаций в языке С++ 41пс1цбе <1овсгеаш.)з> чойб шазп() ( //* Может возбуждаться любая исключительная //* ситуация Дпе пеи дгабе, зпбех, 11ш1с 1, 11ш1г 2, йгед[10] = (0,0,0,0,0,0,0,0,0,0)) е)тоге зпе еой сопбзгдоп) агу ( иы1е (1) ( дг (!сзп » пеи дгабе) //* Когда входной поток сзп //* обнаруживает конец файла, СЬгои еой сопбзп1оп //* возбуждается исключительная //* ситуация еой сопбзгзоп //* 1пбех = пеи дгабе / 10; ( агу ( дк (зпбех < 0 )( 1пбех > 9) Саган(пеи дгас)е); йгед[1пбех] ++з //* конец внутреннего блока Сгу сакс)з(зпе дгабе) ( //* Обработчик для ошибки, // связанной с индексами дй (дгабе == 100) йгед(9]++г е1ве сонг « "Ошибка — новая оценка:"« дгабе « "выходит за пределы допустимого диапазона" « епб1; ) //* конец функции сасс)з(1пс дгабе) ) //* конец блока ип11е(1) ) //* конец внешнего блока Сгу саеаЬ(в)зогС зпп) ( //и Обработчик еоб соис « "Границы Частоты" « епб1; йог(зпбех = 0; 1пбех < 10з 1пбех++) 11ш1г 1 10 * 1пбех; 11ш1с 2 11ш1с 1 + 9; Дг (1пбех == 9) 11шзг 2 = 100) сонг « 11шзг 1 « 11шзс 2 « Егед[дпбех] « епб1; ) //* конец цикла гог (зпбех == 9] ) //* конец функции сасс)з(в)зогг 1пс) ) //* конец функции ша1п Эта программа иллюстрирует механизм обработки исключительных ситуаций в языке С++.
Однако обе исключительные ситуации в данном примере лучше обрабатывать другими средствами. Условие достижения конца файла легче обработать с помошью простой проверки условия выхода из цикла и)з11е, содержашего выражение со входным потоком сзп. Более того, исключительная ситуация, связанная с выходом индекса массива за пределы допустимого диапазона, обычно обрабатывается в языке С++ с помощью перегрузки операции индексирования, которая затем может возбуждать исключи- Глава 13. Обработка исключительных ситуаций тельную ситуацию. а не путем непосредственного распознавания операшш индексирова- ния с помощью условного выражения.
как в приведенном примере. 13.4.6. Оценка В некоторых отношениях механизм ооработки исктючительныч ситуаций в языке С++ похож на соответствуюший механизм языка Аба: связывание псключительныч ситуаций с обработчиками является статическим. и необработанные исключительные ситуации передаются в модуль. вызвавший данную фчнкцпю. Но в лрз пж аспектач разработка языка С++ совершенно отличается от языка Аба. Здесь нет встроенных распошаваемых аппаратурой исключительных ситуаций. которые может обраоатывать пользователь, и исключительные ситуашш не именуются.
Это привозит к странной структуре, при котороЯ исключительные ситуации связываются с обработчиками с помощью типа параметра. причем сам формальный параметр может отсутствовать тип формального параметра обработчика определяет условия. при которых он вызывается. но при этом природа возникшей исключительной ситуации может никак не влиять на его действия. Следовательно. использование встроенных типов определенно не спосооствует повышению читабельности программы.
Намного лучше иерархически определять классы с осмысленными именами. которые можно использовать для определения исключительных ситуаций. 13.5. Обработка исключительных ситуаций в языке Лача В главе !2 пример программы иа языке 1ача содержал обработку исключительных ситуаций с небольшими пояснениями. В этом разделе описываются летали возможностей языка 1ача, связанных с обработкой исключительных ситуаций. Обработка исключительных ситуаций в языке 1ача основывается на механизме.
рсьпп зованном в языке С++, но больше соответствует объектно-ориентированной парадигме. 13.5.1. Классы исключительных ситуаций Все исключительные ситуации в языке Зача являютсл обьектами классов. произволных от класса Тпгсиао1е. Система языка 1ача содержит два системно-ориснгироьанных класса исключительных ситуаций, являющихся подклассами классов ..-. -.:.
-:.. е. Ег лог и Ехсергсоп. Класс Еггог и производные от него классы связаны с гокими ошибками, порождаемыми интерпретатором языка 1ача, как исчерпанная динамическая память. Эти исключительные ситуации никогда не возбуждаются пользовазельскими программами и не обрабатываются там. Сушествуют два класса.
являюшихся непосредственными наследниками классов Ехсер=ьсп, ВцпС1жеЕхсер ' =-.. и Как следует из их названий. исключительная ситуация 10Ехсер ' сп возбуждается при возникновении ошибки в операциях ввода или вывода, каждая из которых определена в качестве метода в различных классах, обьявленных в пакете з ача . Ес. Сушествуют определенные системные классы. являющиеся производными от класса ВцпсбвеЕхсерсдоп. В большинстве случае исключительная ситуация йцп:"'.".ебхсо..- .сп возбуждается, когда пользовательская программа порожлает ошибку.
Например. класс Аггау1пбехОиссВсопблЕхсера1сп. опрелеленый в пакете ~ача. ".'1. обычно воз- 567 13.5. Обработка нсключмтепьнмх ситуаций в языке 3ача буждает исключительную ситуацию, являюшуюся производной от исключительной ситуации йцпг1щеехсерг1оп. Другой широко распространенной возбуждаемой исключительной ситуацией является Ии11РотпсегЕхсерсуоп. Пользовательская программа может определять свои собственные классы исключительных ситуаций. В языке )ача принято соглашение о том, что определенные пользователем исключительные ситуации являются подклассами класса Ехсерсзоп. 13.5.2.
Обработчики исключительных ситуаций Обработчики исключительных ситуаций в языке )ача имеют тот же вид, что и в языке С++. Однако каждая функция саго)э должна иметь параметр, а классы исключительных ситуаций должны быть производными от встроенного класса Т)тгонаЪ1е. Синтаксис конструкции ггу в языке )ача в точности такой же, что и в языке С++.