Языки программирования, 22 лекция (от 23 ноября)
Материал из ESyr's Wiki pages.
Предыдущая лекция | Следующая лекция
Содержание |
Глава 7. Обработка исключений. Исключительные ситуации (exceptions)
Последняя, но первой части. Когда же заканчивать первую часть, как не в конце ноября. Стоит особняком, но вопрос достаточно важный. Обработка исключений. Исключительные ситуации (exceptions)
С одной стиороны, искл. являются типами, но отличаются.
Исключения являются важной тех. потребностью.
Исключения аозникли в ранних ЯП.
ПЛ/1: программа обрадала возможностью реагировать на нек ...
Были обработчики ON ситуация. При возникновении ситуации возникала реакция. Или ..., или переход.
Но. Позже иы увидем, что межанизм исклб не соотв.
Потом исклю появлялись в языках типа Фортрана.
Исключение – нечто, которое может произойти. Необязательно плохое, например ENDFILE. Другой пример – OVERFLOW – нехорошая ошибка. В одну ошибку смешиавались и понятия аварийных ситуаций, и другие. Какая парадигма соотв такой конструкции – концепция прерывания.
С совср точки зрения, исключения – аналог аварийной ситуации. Есмть несколько методов, как не допускать ав ситуаций.
Академическая точка зрения: ошибок в проргаммах, один из источников ошибок- ошибки в программе. Можно сделать абсолютно надёжные прогрнаммы путём математич подхода, и Дейкстра учил, ккак писать текст программы одновременно с её выводом. Там, собствнно, именно показано, как формально решать задачи, и там одновременно строится и программа, и вывод математический. Этот метод получил названия математичесий метод ... программ. Но с точки зрения коммерч програм. не применяется след причине – любое доказательство требует, чтобы было формально известно, что формально программа вделает. Есть предусловие и постусловие, тогда можно формально обосн программу, которая переводит пред в постусловие.
Обычная практика прикладного программирования – заказчик не знает что он хочет, посмотрит на вас как на идиота и пойдёт к другому.
Совр практика прогр такова, что возникают аварийные ситуации. Проргаммист должен по крайней мере отреагировать на ав ситуацию. Челленджер – за 4 секунды до взрыва отрубилась система наведения, за 40-50 начался пожар. Надёжная система не может предотвращить тушение твердотопливного ускорителя, но она должна была обнаружить ситуацию и принять решение – например, отстрелить космонавтов, от етсь кресла.
Надёжное программирование – искусство построение адёжных систем из ненадёжных компонент (цитата).
Иногда можно исправить искл ситуацию, иногда нужно принять меры.
Совр взгля на исключительные ошибки: (не ошибка – их делает кто-то, искл сит возникают сами)
ИС = авария.
Если не рассм, как аварию, то программа деградирует.
Ускореение в десять раз нереально. Однажды студенты переписали авторский алгоритм, который написан на джаве, на джаву. В авторском алгоритме было три вложенных цикла, и когда требовался выцход из самого внутреннего, то делалось исключение, но разрабготчики джавы рассматривают исключение как аварию, и это тяжёлая операция. Если сделать тривиальное изменение, чтобы не использовать исключение, то это сразу должно ускорение в 10 раз.
Поэтому искл ситуации это исключительно аварии.
Языки: Ада, С++, Delphi, Java, C#. Последние три очень похожи друг на друга, наследовали от С++, С++ наследовал от Ада.
Самый простой способ и самый первый был в Аде. Следуя за статьями Кауфмана, рассм четыре аспекта:
- Объявление
- Возникновение
- Распространение
- Обработка
Что такое механизм обраб искл на самом верхнем уровне – отказывает обычный порядок, и тогда работает некий априорный алгоритм, потому что может сломаться сборка мусора, стек.
Росн достоинства обраб исключений – отделение кода обраб исключений от обычного кода.
ода лектор где-то работал, он написал самый главный файлdocuments.c, и ему сказали, что это распространяяется как ОпенСорс и там никто не разберётся.
Любой системный вызов имеет int syscall(params), и если -1 ошибка, если у нас тут чкшь случилась, то он вернёт -1, и наша хадача – каким образом обрабатывать.
У лектора было нарисовано дерево решений, что и как, и правильное решение – только одна веточка, остальные – попытка реагировать на ошибки. Это очень тяжело воспринять. Современный механизм позволяет структурировать программу и отделить мух от котлет.
Чтло предст из себя искл ситуация. Начнём с Ада. В Аде введено слово EXCEPTION, и можно считать, что это встроенный ТД. Объекты-исключения объявляются как обычные переменные, но у них нет инициализации и никаких операций кроме возбуждения и ловушки. Err : EXCEPTION;
Все ограничения на правила огр переменных, имён, правила видимости, и проч-проч-проч.
С++:
искл ситуация ассоциируется с любым ТД. Можно говорить о искл ситуациях типа const char *, int. И можно свести С++ный обраб искл к адским, если сказать, что там исключения только типа инт. Первая реализация искл в компиляторе МС до сих пор остался старый механизм обраб искл, и каждому искл юыл присвоен номер.
В С++ лучше всего придумать класс.
Джава-Дельфи-шарп:
В этих языках вщяли и пошли дальше. Исключение связали с классом.
Delphi, # – Exception
Java – Throwable
В С++ есть возм отказаться от механизма искл вообще. Ибо С++ задумался не как ЯП для инд программирования, а для программиста. Ну и пользователь не должен платить за то, что вы не использует – вирт функции, искл ситуации. Кроме того, С++ задумывался как дополнительный язык. В стандартной библиотеке святой троицы есть станд исключения.
- Джава – в java.lang
- шарп – модуль system
- Дельфи – модуль System //на самом деле SysUtils
raise
С++ - throw, потому что С, не мог использовать raise, потому что есть стандартная библиотека unix raise.
третий аспект: всязывание статич или динамич.
Исключение распространяется по днимаич влженности блоков.
Аццкий процесс распространения
Ада: declare begin операторы end
C++ J# try { } ловушки – try-блок
Исправить ошибку в месте, где её обнаруж, очень тяжело.
Свёртка стека.
Специфика С++ - вызов деструкторов локальных объектов – очень приятное свойство С++.
Джава – честно говорят, что неизвестно, когда удалится объект.
В шарп такая возможность предусмотрена.
try { ... } finally {...} - гарантирует, что как бы не закончился этот блок, эта часть будет выполнена
В С++ такой конструкции нет.
Ловля исключений
Ада: when имя1 |имя2| => оп-ри when имя11 |имя21|... => оп-ри when others => end
В Аде гребенчатая структура, и в конце каждой могут стоять ловушки
raise без параметров может означать перевозбуждение токущей искл ситуации, и может встречаться только после when имя11 |имя21|... =>. Можно также исключение переобернуть в другое исключение. В других ЯП – шарп, жава, плюсы, это смысл имеет.
С++ try { throw } catch(тип искл) {...} catch(тип искл) {...} catch(...) {...} - это разные три точки. Те, которые в скобках – лексема языка, означает, что ловит всй.
тип имя(арг-ы) throw(X, Y, Z ...); {...} X, Y, Z ... - список типов, искл ситуации, часть прототипа Соотв функция может выдавать искл соотв 3 типов. Отсальные или не происходисходят, или обраб. void f() throw (CuserException) {}
Языки Программирования
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Календарь
чт | вт | чт | вт | чт | вт | чт | вт | чт | вт | |
Сентябрь
| 05 | 07 | 12 | 14 | 19 | 21 | 26 | 28 | ||
Октябрь
| 03 | 05 | 10 | 12 | 17 | 19 | 24 | 26 | 31 | |
Ноябрь
| 02 | 14 | 16 | 21 | 23 | 28 | 30 | |||
Декабрь
| 05 | 07 | 12 | 14 | 19 |