Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 148
Текст из файла (страница 148)
Ее конструктор выводит сообщение при создании объекта данного класса. а обработчик осуществляет вывод результатов работы метода. Исключительная ситуация Аггау1пс(ехбис01Воипс(аЕхсерсфоп является встроенной и возбуждается интерпретатором. Во обоих случаях обработчик не содержит имени объекта в качестве параметра. Ни в олном из этих случаев имена не служат никаким целям. Заметилн что все обработчики получают обьекты в качестве параметров, но часто это бывает вредно. 13.5.7. Опвратор ЕдпаХХу Существуют ситуации, при которых процесс должен быть выполнен независимо от того, возбудил ли оператор сгу исключительную ситуанню или нет, и перехватил ли некий метод возбужденную исключительную ситуацию или нет.
Одним из примеров такой ситуации является закрытие файла. Другой пример — наличие некоторых внешних ресурсов, которые должны быть освобождены в методе независимо от того, каким именно образом завершилось его выполнение. Для этих целей был разработан оператор Едпа11у, помешаемый в конце списка обработчиков сразу после конструкции сгу. В общем случае полная конструкния блока выглядит следующим образом: сгу ( оасо)з (...) ( //** другие обработчики йдпа11у ) Семантика этой конструкции такова: если оператор сгу не возбуждает ни олной исключительной ситуации, оператор Ейпа11у выполняется перед тем, как выполнение программы будет продолжено и после выполнения конструкции сгу.
Если оператор сгу возбу.кдает некую исключительную ситуанию и она перехватывается следующим обработчиком, оператор Ейпа11у выполняется после того. как обработчик закончит свое , выполнение. Если оператор сгу возбуждает некую ситуацию, но она не перехватывается обработчиком, следующим за конструкцией сгу, оператор Едпа11у выполняется до передачи исключительной ситуации. 572 Глава 13. Обработка исключительных ситуаций За конструкцией кгу, не имеющей обработчиков исключительных ситуаций.
может следовать оператор Ейпа11у. Это имеет смысл только в том случае, если составной оператор содержит оператор ъгеа)с сопсйпие нли гекигп. Цель этого оператора в этих случаях та же, что и при обработке исключительных ситуаций. Например: кгу ( йог (1пс(ех = 0; 1пс(ех < 100; зпс)ех+~) И (...) ( гесцгп; ) // конец сператсра //* конец цикла бог ) //* конец оператора Ггу гзпа11у ( ) //* конец конструкции Ггу Оператор гйпа11у здесь будет выполнен независимо от того, прекратил ли оператор гекигп выполнение цикла, или он завершился нормальным образом. 13.5.8.
Оценка Механизм обработки исключительных ситуаций в языке эача усовершенствован по сравнению с языком С~+, на котором он основывается. Во-первых, программа на языке С++ может возбуждать исключительную ситуацию любого типа, определенного в программе или системой. В языке )ача могут быть возбуждены только объекты, являющиеся экземплярами класса Т)згонаЫе или производных от него классов. Это позволяет отделить возбуждаемые объекты от всех других объелтов (и не объектов) в программе. Какой смысл может иметь исключительная ситуация.
приводящая к возбуждению значения типа йпв? Во-вторых, модуль программы на языке С-+, не содержащий оператор с)згомв, может возбудить любую исключительную ситуацию. которая ничего не говорит пользователю. Метод на языке 3ача, не содержащий оператор с)згомв. не может возбудить ни одной проверенной исключительной ситуации, которую он не обрабатывает. Следовательно. читатель метода на языке )ача знает из его заголовка, какие исключительные ситуации метод может возбудить, не обрабатывая их. В-третьих, оператор гьпа11у очень удобен в определенных ситуациях.
Он позволяет упорялочить виды действий, которые должны иметь место независимо от того. как именно завершилось выполнение составного оператора. В заключение отметим, что система поддержки выполнения программ на языке )ача неявно возбуждает множество исключительных ситуаций. таких как выход инлекса массива за пределы допустимого диапазона и поступ к нулевому указателю. которые могут быть обработаны любой пользовательской программой. Программа на языке С+~ может обрабатывать лишь те исключительные ситуации, которые возбуждаются явно. Обработку исключительных ситуаш1й в языках Аг(а и )ача трудно сравнивать. Наличие оператора с)згомв в методе на языке )ача очень облегчает чтение программ.
в то время как в языке Ада нет аналогичных возможностей. Язык )ача определенно ближе к языку Ада, чем к языку Сь+. в том смысле, что он позволяет программам обрабатывать обнаруживаемые системой исключительные ситуации. $73 13.5. Обработка исключительных ситуаций в языке эача Обработка исключительных ситуаций в широко распространенных языках применялась релко, несмотря на то, что многие экспериментальные языки, разработанные с сере:щпы 1970-х голов. имели такие возможности. Язык Р1.
! имеет мощные и гибкие средства обработки исключительных ситуаций, по. помимо всего прочего, они слишком сложны для понимания и использования. Динамическое связывание исключительных ситуаций с их обработчиками является олним из главных источников этих проблем. Язык Ада обеспечивает широкие возможности по обработке исключительных ситуаций и небольшой. но исчерпывающий.
набор встроенных исключительных ситуаций. Иск.иочительные ситуации связываются с обработчиками статически. Обработчики добавлякася к сущностям программы, хотя исключительные ситуации могут явно или неявно передаваться другим сущностям программы, если нет локального обработчика. Обработка исключительных ситуаций в языке С++ использует статическое связывание псклю«итсльных ситуаций с обработчиками. В языке не предусмотрены встроенные пск.иочн~ельныс ситуации. Исключительные ситуации связываются с обработчиками с помощью связывания типа выражения в операторе С!зхаи с типом формального параметра обработчика. Все обработчики имеют одно и то же имя ааса!з.
Исл;почительные ситуации в языке )ача являются объектами, происхождение которых должно быть отслежено обратно вплоть до некоторого класса, реализующего интерфейс . 'гтс иаЬ1е. Существуют две категории исключительных ситуаций — проверенные и непроверенные.
Проверенные исключительные ситуации относятся к пользовательской программе и компилятору. Непроверенные исключительные ситуации могут во шикать вск лу и часто игнорируются пользовательской программой. Оператор сдвоив метода в языке Зача перечисляет проверенные исключительные си~) эпин. которые люгут быть возбуждены и не обрабатываются. Этот оператор должен содер,кать исключительные ситуации, которые могут возбуждаться вызывающим его ме~ одом.
и передавать их обратно в вызывающий метод. Оператор хапа11у в языке Зача обеспечивает механизм, гарантирующий, что некий кол будет выполнен независимо от того, как именно завершилось выполнение составного оператора Сху. э ° т Озноб из наиболее важных работ по обработке исключительных ситуаций, не связанной ни с одним конкретным языком программирования. является работа Ооог(епоцбЬ ! !978). Проблемы. связанные с разработкой средства обработки исключительных сит) ацпй в языке Р1..'1, рассматривались в работе Мас(.агап (1977). Обработка исключи~ сльных сизз аций в языке СШ описана в работе (лз)гот апд Бпудег (1979). Средства ооработки исключительных ситуаций в языке Аг(а рассмотрены в работе Оооба апд Иагппапга (!983).
Обработка исключительных ситуаций в языке С++ обсуждается в с ~ а ~ ьс 81гацыгцр ( ! 99 ! ). Глава 13. Обработка исключительных ситуаций 574 3. 5. б. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 2О. 21. 22. Дайте определение следуюших понятий: исключительная ситуация, обработчик исключительной ситуации, возбуждение исключительной ситуации, блокирование искзючительной ситуации, продолжение выполнения програчмы и встроенная искзючитетьная ситуация.
В чем заключаются вопросы проектирования средств обработки исключительных ситуаций? Что представляет собой связывание исключительной ситуации с обработчиком исключительной ситуации? В чем заключается проблема связывания исключительных ситуаций с обработчиком в языке Р1Л? Каковы возможные рамки применения исключительных ситуаций в языке Ада? Куда передаются необработанные исключительные ситуации в языке Ада, если он возникли в подпрограмме, в блоке, в теле пакета или в задаче? С какого места возобновляется выполнение программы после обработки исключительной ситуации в языке Ада? Как можно возбудить исключительную ситуацию в языке Ада явным образом? Как объявляется в языке Аба исключительная ситуация, определенная пользователем? Как можно подавить исключительную ситуацию в языке Ада? Как называются все обработчики исключительных ситуаций в языке С++? Как можно возбудить исключительную ситуацию в языке С++ явным образом? Как в языке С++ исключительные ситуации связываются с обработчиками? Как иа языке С++ написать обработчик исключительной ситуации так, чтобы он обрабатывал любую исключительную ситуацию? Куда передается управяение после завершения выполнения обработчика исключительной ситуации в языке С++? Существуют ли в языке С++ встроенные исключительные ситуации? Какой класс является корневым для всех классов исключительных ситуаций в языке 1ача? Какой класс является базовым для большинства определенных пользователем классов исключительных ситуаций в языке 1ача? Как на языке 1ача написать обработчик исключительной ситуации так, чтобы он обрабатывал любую исключительную ситуацию? В чем заключается разница между спецификацией тЛзкои в языке С++ и оператором еЬкоив в языке 1ача? В чем заключается разница между проверенными и непроверенными исключительными ситуациямн в языке 1ача? Можно ли заблокировать исключительные ситуации в языке 1ача? Для чего предназначен оператор бйпа11у в языке 1ача? Вопросы "'Гйнжай Мвк4арти Ь)сйп МсСагг)гу) Джон Мак-Карти и Марвин Мински (Манн)п М)паху) в 1959 году разработали в Массачусетском технологическом институте проект по созданию искусственного интеллекта.