Я знаком с дюжиной языков программирования, которые в некотором роде имеют исключения, но я стал свидетелем двух «патологических» тенденций.
Кажется, что не существует общего шаблона или иерархии исключений. Каждый язык в основном катит свою собственную версию, и если исключения делают это стандартом, то исключения, которые можно найти в стандарте, были бы довольно произвольными (в основном те, которые были реализованы при создании языковых инструментов, таких как чтение исходного кода из строка или исключение для вызова отладчика, или то, что происходит, когда файл не может быть найден и т. д.)
Исключения, определенные языком, очень редко используются пользовательскими программами. Обычно бывают одно или два популярных исключения (например, «не реализовано»). Хотя в большинстве случаев программисты создают свои собственные исключения. (Сравните это, например, с созданием новых числовых типов или новых типов коллекций).
Это выглядит как ужасное упущение для меня. Почему никто не знает, какие ошибки будут нужны в пользовательских программах? Я надеялся, что будет какая-то хорошая иерархия, похожая на числовые типы, коллекции, объектную систему и т. Д.
Что еще хуже, Goolge и Wikipedia предоставляют очень небольшую помощь по этому вопросу. Пока что я нашел только статью о функциональном исключении, которая открывается в отрывке:
В этой статье утверждается, что ленивое функциональное программирование не только делает ненужным встроенный механизм обработки исключений, но и предоставляет мощный инструмент для разработки и преобразования программ, использующих исключения
(Функциональная теория исключений, Майк Спиви, 1988)
Но я думаю, что исключения хороши. Я не хочу трансформировать программы, использующие исключения, напротив, я хочу сделать использование исключений менее хаотичным.
Вопрос:
Есть ли теория исключений? Если так, то как это называется? Каковы, если таковые имеются, краеугольный камень работы с изложением основы этого?
LookupError
он прекрасно подойдет для каждого пользовательского контейнера, но многие люди даже не знают, что он существует.Ответы:
Существует большое количество публикаций об исключениях, и довольно много теоретических исследований. Вот неструктурированный и далеко не полный список с некоторыми примерами. Извините, у меня нет времени для более сфокусированного ответа.
источник
Я не знаю, есть ли теория, но может появиться прагматическая экспериментальная наука.
Лучший источник, о котором я могу думать, это Бьярн Страуструп, «Дизайн и эволюция C ++», Addison-Wesley, 1994 . Если я правильно помню (это очень хорошая книга, и люди продолжают заимствовать ее у меня, а не возвращают, поэтому у меня нет копии в данный момент), есть глава об исключениях. Комитет C ++ при Страуструпе потребовал много эмпирических доказательств того, что предложенная функция была необходима, прежде чем они захотели добавить ее в определение языка. На странице Википедии об исключениях есть следующая цитата из этой книги:
В C ++ реальным выигрышем является RAII , который значительно облегчает обработку освобождения ресурсов во время ошибок. (Это не избавляет от необходимости
throw
иtry
-catch
, но это означает, что вам не нужноfinally
.)Я думаю, что то, что убедило их в том, что им нужны исключения, - это общие контейнеры: средство записи контейнеров ничего не знает о видах ошибок, которые должны возвращаться содержащимися объектами (тем более о том, как их обрабатывать), но о коде, который вставил эти объекты в Контейнер должен знать что-то об интерфейсе этих объектов. Но поскольку мы ничего не знаем о том, какие ошибки могут генерировать содержащиеся объекты, мы не можем стандартизировать типы исключений. (Контрапозитивно: если бы мы могли стандартизировать типы исключений, то нам не понадобились бы исключения.)
Другая вещь, которую люди, кажется, усвоили за эти годы, состоит в том, что спецификации исключений трудно правильно вставить в язык. См. Например это: http://www.gotw.ca/publications/mill22.htm или это: http://www.gotw.ca/gotw/082.htm . (И это не только C ++, Java-программисты также имеют длинные аргументы о своем опыте с проверенными и непроверенными исключениями .)
Немного об истории исключений. Классическая статья: Джон Б. Гуденоф: «Обработка исключений: проблемы и предлагаемые обозначения», Commun. ACM 18 (12): 683-696, 1975. Но исключения были известны до этого. Они были у Месы примерно в 1974 году, и, возможно, они были у PL / I. У Ады был механизм исключений до 1980 года. Я полагаю, что на исключения C ++ больше всего повлиял опыт работы с языком программирования CLU Барбары Лисков примерно с 1976 года. Барбара Лисков: «История CLU», « История языков программирования» - II , Томас Дж. Бергин-младший и Ричард Г. Гибсон-младший (ред.). С. 471-510, ACM, 1996 .
источник
serious-condition
противsimple-condition
. Я также сейчас читаю Дж. Л. Остинга, где он классифицирует ошибки (не связанные с программированием) по группам, основываясь на том, как система не смогла выполнить задачу (например, использовались неподходящие детали против неискренних намерений). Что не сразу применимо к программированию, но может быть после некоторой доработки.very strong objection
Против исключения в C ++ вытекает два факта: нетfinally
конструкции, и никто больше не использует исключения. Первая проблема также усугубляет вторую. То есть, когда у вас нетfinally
, вы не можете закрыть ресурс, когда происходит исключение. Поскольку никто не использует исключения, все функции / API избегают их, вы должны вложить большие средства в перестройку всей традиционной инфраструктуры C ++, обернув все функции вашими исключениями, чтобы начать получать преимущества от них в своем коде. Но отсутствиеfinally
делает этот подход невозможным.Позвольте мне просто указать, что исключения являются случаем вычислительного эффекта . Другими вычислительными эффектами являются изменяемое состояние, ввод-вывод, недетерминизм, продолжения и многие другие. Таким образом, ваш вопрос можно задать более широко: как мы формируем иерархии вычислительных эффектов, как мы их организуем, и почему у нас есть те, которые у нас есть, а не другие, и т. Д.
источник