Существует множество требований, необходимых для правильной передачи и обработки исключений системой. Существует также много вариантов выбора языка для реализации концепции.
Требования к исключениям (в произвольном порядке):
Документирование : язык должен иметь возможность документировать исключения, которые может генерировать API. В идеале этот носитель документации должен быть пригоден для использования машиной, чтобы компиляторы и IDE могли оказывать поддержку программисту.
Передача исключительных ситуаций : эта ситуация очевидна, чтобы позволить функции передавать ситуации, которые мешают вызываемой функциональности выполнить ожидаемое действие. На мой взгляд, есть три большие категории таких ситуаций:
2.1 Ошибки в коде, которые приводят к тому, что некоторые данные являются недействительными.
2.2 Проблемы с настройкой или другими внешними ресурсами.
2.3 Ресурсы, которые по своей природе ненадежны (сеть, файловые системы, базы данных, конечные пользователи и т. Д.). Это небольшой случай, так как их ненадежный характер заставляет нас ожидать их спорадических неудач. В этом случае эти ситуации следует считать исключительными?
Предоставьте достаточно информации для кода, чтобы справиться с ним : Исключения должны предоставлять достаточную информацию для вызываемого, чтобы он мог реагировать и, возможно, справляться с ситуацией. информация также должна быть достаточной, чтобы при регистрации эти исключения обеспечили программисту достаточный контекст, чтобы идентифицировать и изолировать ошибочные операторы и предоставить решение.
Обеспечить уверенность программиста в текущем состоянии состояния выполнения его кода : возможности обработки исключений в программной системе должны присутствовать достаточно, чтобы обеспечить необходимые меры безопасности, оставаясь в стороне от программиста, чтобы он мог сосредоточиться на задаче в рука.
Чтобы покрыть это, были реализованы следующие методы на разных языках:
Проверенные исключения Обеспечивают отличный способ документировать исключения, и теоретически при правильной реализации должны обеспечивать достаточную уверенность в том, что все в порядке. Однако стоимость такова, что многие считают более продуктивным просто обходить либо проглатывая исключения, либо перебрасывать их как непроверенные исключения. При ненадлежащим образом проверенных исключениях все это теряет свою полезность. Кроме того, проверенные исключения затрудняют создание API, стабильного во времени. Реализации универсальной системы в конкретном домене принесут массу исключительных ситуаций, которые будет сложно поддерживать с использованием исключительно проверенных исключений.
Непроверенные исключения - гораздо более универсальные, чем проверенные исключения, они не могут должным образом документировать возможные исключительные ситуации данной реализации. Они полагаются на специальную документацию, если вообще. Это создает ситуации, когда ненадежный характер среды маскируется API, который создает видимость надежности. Кроме того, когда эти исключения выбрасываются, они теряют свое значение по мере продвижения вверх через уровни абстракции. Так как они плохо документированы, программист не может нацеливаться на них конкретно, и ему часто приходится создавать гораздо более широкую сеть, чем необходимо, чтобы вторичные системы, если они выйдут из строя, не сломали всю систему. Что возвращает нас к проблеме глотания проверенных исключений.
Типы возвращаемых данных с несколькими состояниями Здесь необходимо полагаться на непересекающийся набор, кортеж или другую подобную концепцию для возврата ожидаемого результата или объекта, представляющего исключение. Здесь нет разматывания стека, нет вырезки кода, все выполняется нормально, но возвращаемое значение должно быть проверено на наличие ошибок перед продолжением. На самом деле я еще не работал с этим, поэтому не могу прокомментировать из своего опыта. Я признаю, что он разрешает некоторые проблемы, исключая обход нормального потока, но все же он будет страдать от тех же проблем, что и проверенные исключения, так как он утомителен и постоянно "перед вами".
Итак, вопрос:
Каков ваш опыт в этом вопросе и что, по вашему мнению, является лучшим кандидатом для создания хорошей системы обработки исключений для языка?
РЕДАКТИРОВАТЬ: Через несколько минут после написания этого вопроса я наткнулся на этот пост , жуткий!
noexcept
истории на C ++ может дать очень хорошее представление о EH в C # и Java.)