Лекция 16 (лекции (2002))

2019-09-19СтудИзба

Описание файла

Файл "Лекция 16" внутри архива находится в папке "лекции (2002)". Документ из архива "лекции (2002)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Онлайн просмотр документа "Лекция 16"

Текст из документа "Лекция 16"

Продолжение темы

обработка исключительных (аварийных) ситуаций в ЯП.

Язык Ада

Схема обработки аварийных ситуаций, принятая в языке Ада:

  1. Определение.

Используется псевдотип данных exception. Определение исключения

A: exception

Бывает 5 видов предопределенных исключений, которые возбуждаются компилятором. Код по порождению их возбуждения вставляется компилятором. Например, range error – исключение, которое возбуждается при выходе за границу диапазона массива; исключение, связанное с нехваткой памяти, и т.д.

Под псевдотипом exception подразумевается некоторый беззнаковый целочисленный код. Это частный случай.

  1. Возникновение.

Есть оператор raise, который возбуждает исключение.

raise A;

Частный случай этого оператора

raise;

может употребляться только в ловушке исключения. raise используется при частичной обработке исключения. Она имеет место, если исключение перехвачено, но обработчик не может обработать его полностью и перевозбуждает его. Блок, в котором оно возникло, освобождает ресурсы, которые были захвачены в нем до возникновения исключения, и передает ошибку на более высокий уровень.

  1. Распространение.

Основополагающий принцип во всех языках, которые мы будем разбирать, у Кауфмана назван принцип динамической ловушки, у Страуструпа и Себесты - принцип завершения. Он заключается в том, что весь блок, в котором возникла ошибка, и конструкция, в которой возникла ошибка, считаются ошибочными и далее управление к ним уже не вернется. Оно может вернуться позже, когда блок будет перевызван.

Если конструкция ошибочна, и в блоке не найдется соответствующих ловушек, то исключение выходит на более высокий уровень. Это называется распространение исключения. Ошибка распространяется по цепочке динамической вложенности этих блоков, и, чем больше блоков не обработало ошибку, тем на большие участки программ распространяется ошибка. Если ошибка доходит до главной функции, и никакой реакции на нее нет, то программа аварийно завершает свою работу.

  1. Обработка исключений.

В конце каждого блока может стоять обработчик исключения.

when A=> обработчик

Обработчик – некая последовательность операторов, которые должны ликвидировать ошибку. Способ ликвидации зависит от ошибки.

Обработка может быть частичной, Когда в обработчике появляется

raise;

В некоторых случаях может стоять

when others => …

Это необязательная конструкция. Все условия перебираются сверху вниз, и, если встречается when others, то этим обработчиком перехватывается любое исключение. После этой конструкции ставить другие обработчики не имеет смысла, поскольку соответствующее им исключение будет уже перехвачено.

Языки С++, Delphi, C#, Java взяли общие идеи обработки исключений из языка Ада. В них были расширены концепции, добавлены новые решения, но базис обработки исключений такой же, как в языке Ада.

Язык С++

Рассмотрим механизм обработки исключительных ситуаций в языке С++.

  1. Определение.

В Аде механизм обработки исключений имманентен любой программе. Компилятор вставляет предопределенные исключения, пользователь может вставлять некоторые исключения. Можно не вставлять свои исключения, но механизм обработки исключений все равно будет в программе. Полагается, что случаи, когда нас не интересуют исключительные ситуации, при программировании на языке Ада достаточно редкие.

Не в любых программах следует тщательно заботиться об обработке ошибок. При научном программировании человек программирует для себя или результатом его работы пользуется ограниченное количество его коллег, и программа чаще всего нужна для того, чтобы сделать расчеты для решения какой-то задачи. В научно-исследовательском программировании слишком сильно заботиться об обработке ошибок то же самое, что забивать гвозди осциллографом. Один из основных принципов языкового дизайна, который использовал Страуструп при создании языка С++ - то, что пользователь не должен расплачиваться за конструкции, которые он не поддерживает. Механизм обработки исключений – достаточно дорогой механизм. В С++ он еще более дорогой с точки зрения ресурсов, чем соответствующий механизм в языке Ада. Пользователь, который по каким-то причинам не хочет обрабатывать исключения (например, с целью экономии ресурсов, или его вообще не интересует такая обработка ошибок), не должен за это платить. Поэтому в С++ отсутствует механизм предопределенных исключений. Если пользователь не использует исключения, значит, их в программе не будет. Более того, некоторые компиляторы в качестве опций позволяют отключать механизм обработки исключений. Это сделано для удобства некоторых видов пользователей, хотя с точки зрения индустриального программирования исключения должны использоваться.

Одним из главных недостатков механизма обработки исключений в языке Ада является то, что с исключениями связывается только его код. Никакой другой информации с исключением передать нельзя. Следовательно, блоки, которые занимаются исправлением ошибки, обладают очень малой информацией. Например, известно только то, что произошел выход за границу массива. Где, с каким значением, почему – остается неизвестным. Идея Страуструпа заключается в том, чтобы исключительная ситуация отождествлялась с типом данных. Механизм обработки исключений в Аде является частным случаем механизма обработки исключений в С++, когда исключительная ситуация связывается с типом данных int. При этом каждому исключению приписывается некоторая численная константа, которая характеризует его вид. Это наиболее простой, легкий для реализации способ. В самых первых коммерческих компиляторах С++ (таких как Borland C++, Microsoft C++), исключительные ситуации были только типа int. ОС присваивает ошибке некоторый целочисленный код. Но механизм, который был предложен еще в 1989 г., и включен в стандарт в 1990 г. более гибкий. В нем в качестве исключительной ситуации можно брать любой тип. Например, char *. В этом случае исключительная ситуация связывается с некоторой строкой, которая несет словесную информацию об ошибке. Ее, например, можно напечатать. Исключительная ситуация чаще всего связывается с некоторым классом. Объект исключительного класса, скорее всего, будет содержать в себе данные, которые каким-либо образом характеризуют ошибку. Человек, который возбуждает исключительную ситуацию (программист, который пишет соответствующий оператор), вставляет в параметры конструктора этого класса соответствующие данные. Таким образом, все, что нам необходимо знать об ошибке, мы можем передать в момент ее возникновения. Так решается проблема, связанная с тем, что больше всего информации об ошибке мы знаем в момент ее возникновения. В MFC есть заготовка - класс, который называется CException. Рекомендуется все пользовательские классы обработки исключений выводить из этого класса.

  1. Возникновение.

Поскольку нет никаких предопределенных исключений в языке С++, то все исключения (по стандарту) возникают с помощью оператора

throw expression;

Как отмечал сам Страуструп слово raise, которое было применено в языке Ада, существенно более адекватно, чем слово throw. Он не использовал слово raise потому, что оно было занято стандартными заголовочными файлами ОС UNIX. Беда С++ в том, что он первоначально развивался как язык над С и как язык внутри UNIX. Поэтому Страуструп не мог вводить ключевые слова по своему желанию. В результате слово throw перешло в другие языки программирования.

Тип expression определяет исключительную ситуацию, которая произошла.

throw new CMyExeption(…);

Исключительная ситуация, как правило, передается как указатель на некоторый динамически порожденный объект класса. В этом случае проблема возникает, если ошибка связана с нехваткой динамической памяти. Можно написать просто

throw CMyExeption(…);

В этом случае механизм обработки исключений должен использовать не стандартный распределитель памяти, т.к. именно в процессе его работы возникла ошибка. Он должен использовать какой-то свой локальный распределитель памяти, какую-то специальную область памяти, выделенную для механизма обработки исключительных ситуаций.

Как вы видите, реализация исключений в С++ сложнее чем в Ада, а накладные расходы – больше потому, что передать через регистр целочисленный код легче, чем передавать произвольную информацию.

  1. Распространение.

Механизм распространения почти такой же, как в языке Ада. Если в некотором блоке возникло исключение, он считается ошибочным, и управление на него после обработки исключения не передастся. Пусть есть некоторый блок

{X x;

S;

Y y;

}

Если при выполнении S – возникает ошибочная ситуация, то весь этот блок считается ошибочным. В отличие от языка Ада в С++ есть классы. У классов есть конструкторы и деструкторы. В процессе функционирования, например, при конструировании объекта, могут быть захвачены некоторые ресурсы. Например, динамическая память. В Аде объявить блок ошибочным – аварийно закончить выполнение этого блока. Это схоже с аварийным выходом из блока по return. В С++ ситуация чуть более сложная. Если в середине блока произошла авария, необходимо гарантировать, что будут выполнены деструкторы всех объектов, которые размещены в ошибочном блоке. Это значит, что все эти объекты должны быть выброшены из стека, причем с выполнением деструкторов. Поэтому в С++ появляется специальный термин – свертка стека. Во время распространения исключения ошибочная ситуация охватывает все большие и большие области памяти. Пусть есть динамическая вложенность вызова функций

Р1


Р2

Р3

А Р3 представляет собой наш блок, в котором произошла ошибка.

Стек

х


локальные

переменные Р2

локальные

переменные Р1

Свертка стека – выполнение деструкторов локальных объектов, размещенных в блоках, которые признаны ошибочными. Для Ады свернуть стек - прибавить к sp какую-то константу (размер объектов, которые надо удалить). В С++ необходимо выполнить деструктор локальных объектов. В нашем примере нужно выполнить деструктор объекта х, но не деструктор объекта у.

Свертка стека – одно из главных достижений языка С++. Этот процесс гарантирует то, что если в блоке были захвачены какие-то ресурсы, они будут освобождены вне зависимости от того как завершил работу блок (нормальным образом или с ошибкой). Отсюда исходит идеология обработки ресурсов в языке С++. Ресурс связывается с каким-то специальным классом. В конструкторе класса захватывается ресурс, в деструкторе – освобождается. Если нам нужна временная работа с ресурсом, мы описываем блок, вначале которого размещаем объект-ресурс. Семантика работы со стеком, в частности механизм свертки стека, гарантирует, что все ресурсы, которые размещены в стеке, будут в нужное время освобождены автоматически. Это большое достоинство механизма обработки исключений в языке С++.

  1. Обработка.

Как и в Аде, мы привязываем к некоторым конструкциям (блокам) обработчики исключений. Страуструп в свое время отмечал, что минимальной синтаксической конструкцией является

оператор список_обработчиков

Но синтаксически хотелось выделить, что в соответствующем операторе контролируются ошибочные ситуации. Поэтому был выбран избыточный синтаксис

try блок список_обработчиков

Обработчик

catch(тип [имя]) блок;

Частный случай обработчика

catch(…) блок;

Это то же самое, что when others в языке Ада. Как и в языке Ада, он должен располагаться последним, поскольку типы исключений перебираются в порядке перечисления в списке обработчиков. Если с исключением не было отождествлено ни одного типа, то прорабатывает эта ловушка, если она есть.

Защищенной конструкцией, как и в языке Ада, является блок.

try{

S;

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
426
Средний доход
с одного платного файла
Обучение Подробнее