Обработка исключений: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
→‎Поддержка в различных языках: уточнение, дополнение
Строка 95:
За исключением незначительных различий в синтаксисе, существует лишь пара вариантов обработки исключений. В наиболее распространённом из них исключительная ситуация генерируется специальным оператором (<code>throw</code> или <code>raise</code>), а само исключение, с точки зрения программы, представляет собой некоторый [[Объект (программирование)|объект]] данных. То есть, генерация исключения состоит из двух этапов: создания объекта-исключения и возбуждения исключительной ситуации с этим объектом в качестве [[Параметр (программирование)|параметра]]. При этом конструирование такого объекта само по себе выброса исключения не вызывает. В одних языках объектом-исключением может быть объект любого типа данных (в том числе строкой, числом, указателем и так далее), в других — только предопределённого типа-исключения (чаще всего он имеет имя <code>Exception</code>) и, возможно, его производных типов (типов-потомков, если язык поддерживает объектные возможности).
 
Область действия обработчиков начинается специальным ключевым словом <code>try</code> или просто языковым маркером начала блока (например, <code>begin</code>) и заканчивается перед описанием обработчиков (<code>catch</code>, <code>except</code>, <code>resque</code>). Обработчиков может быть несколько, один за одним, и каждый может указывать тип исключения, который он обрабатывает. ЕслиКак языкправило, поддерживаетникакого [[Наследованиеподбора (программирование)|наследование]]наиболее иподходящего типы-исключенияобработчика могутне наследоватьсяпроизводится, други отвыполняется другапервый же обработчик, тосовместимый обработкойпо исключениятипу занимаетсяс первыйисключением. Поэтому порядок следования обработчиков имеет важное значение: если обработчик, совместимый с исключениеммногими поили типувсеми типами исключений, окажется в тексте прежде специфических обработчиков для конкретных типов, то специфические обработчики не будут использоваться вовсе.
 
Некоторые языки также допускают специальный блок (<code>else</code>), который выполняется, если ни одного исключения не было сгенерировано в соответствующей области действия. Чаще встречается возможность гарантированного завершения блока кода (<code>finally</code>, <code>ensure</code>). Заметным исключением является Си++, где такой конструкции нет. Вместо неё используется автоматический вызов [[деструктор]]ов объектов. Вместе с тем существуют нестандартные расширения Си++, поддерживающие и функциональность <code>finally</code> (например в [[MFC]]).