Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | [[Языки программирования, 21 лекция (от 21 ноября)|Предыдущая лекция]] | [[Языки программирования, 23 лекция (от 28 ноября)|Следующая лекция]]
| + | == From Ebaums Inc to MurkLoar. == |
- | | + | We at EbaumsWorld consider you as disgrace of human race. |
- | <!-- ЯП 23.11.06 -->
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | | + | Dig yourself a grave - you will need it. |
- | ==Глава 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. И можно свести С++ный обраб искл к адским, если сказать, что там исключения только типа инт. Первая реализация искл в компиляторе МС до сих пор остался старый механизм обраб искл, и каждому искл юыл присвоен номер.
| + | |
- | | + | |
- | В С++ лучше всего придумать класс.
| + | |
- | | + | |
- | ===Джава-Дельфи-шарп:===
| + | |
- | | + | |
- | В этих языках вщяли и пошли дальше. Исключение связали с классом.
| + | |
- | | + | |
- | <!-- JD# - JeDi sharp -->
| + | |
- | | + | |
- | 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) {}
| + | |
- | | + | |
- | {{Языки Программирования}}
| + | |
- | {{Lection-stub}}
| + | |