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

Общая

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

Языки программирования значительно отличаются в своей поддержке обработки исключений (в отличие от проверки ошибок, которая является обычным потоком программ, который проверяет непредвиденные обстоятельства, такие как неудачное завершение вызванных операций). В некоторых языках программирования есть функции, которые нельзя безопасно вызывать для неверных входных данных, или функции, которые возвращают значения, которые нельзя отличить от исключений. Например, в cфункция atoi (преобразование ASCII в целое число) может возвращать 0 (ноль) для любого ввода, который не может быть проанализирован в допустимое значение , В таких языках программист должен либо выполнить проверку ошибок (возможно, с помощью некоторой вспомогательной глобальной переменной, такой как C errno), либо проверку ввода (возможно, с использованием регулярных выражений), либо и то, и другое.

Обработка исключений основана на трех ключевых словах: try, catch и throw.

  • try: Блок try идентифицирует блок кода, для которого исключения будут активированы. За ним следует один или несколько catch блоки.
  • throw: Программа выдает исключение при обнаружении проблемы. Эта делается с помощью ключевого слова throw.
  • catch: Программа ловит исключение с помощью обработчика исключений в место в программе, где вы хотите решить проблему. Ключевое слово catch указывает на перехват исключения.

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

try
{
   // protected code
}
catch( ExceptionName e1 )
{
   // catch block
}
catch( ExceptionName e2 )
{
   // catch block
}
catch( ExceptionName eN )
{
   // catch block
}

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

Исключительная безопасность

Исключительная безопасность, как формализовано Дэвидом Абрахамсом, гарантирует набор руководящих принципов контракта, которые интерфейс (или операция) предлагает w.r.t. состояние программы в случае возникновения исключения.

  1. Гарантия без бросков: операция гарантированно не провалится
  2. Сильная безопасность исключений: в случае сбоя операции состояние будет таким, каким оно было до сбоя (семантика отката)
  3. Безопасность базовых исключений: утечки не произойдет, и данные останутся в действительном состоянии (но, возможно, будут изменены)
  4. Не исключение безопасности: никаких гарантий не сделано.

Автоматическая обработка исключений

Автоматическая обработка исключений - это вычислительный термин, относящийся к компьютеризированной обработке ошибок. Механизмы выполнения, такие как для языка Java или Microsoft .NET, поддаются автоматическому режиму обработки исключений или ошибок. В этих средах программные ошибки не «приводят к сбою» программы или операционной системы, а скорее генерируют исключения. Последние достижения в этих средах выполнения позволяют специализированным дополнительным продуктам среды выполнения обеспечивать автоматизированную обработку исключений, которая не зависит от исходного кода и предоставляет информацию о первопричинах для каждого интересующего исключения.

Использование тегов

Используйте этот тег для

  • Вопросы о техническом процессе того, как различные языки, среды выполнения или платформы обрабатывают (или не обрабатывают) конкретные исключения.
  • Вопросы о реализации пользовательских возможностей автоматической обработки исключений.

Не используйте этот тег для

  • Отладочные запросы, содержащие исключение как часть MCVE, но не относятся к исключениям. Это вопросы, которые содержат исключения, но не о них. В одном из предложенных нами отредактированных отклонений содержится текст «Теги должны помочь описать суть вопроса, а не только его содержание».

Рекомендации

Синтаксис обработки исключений

Дальнейшее чтение

Vexing исключенийв блоге MSDN Эрика Липперта, 2008 г.
Более чистый, элегантный и сложный для распознаванияпост в блоге MSDN Раймонда Чена, 2005
Исключительно безопасное кодирование на C ++, веб-страница Джона Калба