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

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 133:
Корректная реализация исключений может быть затруднительной в языках с автоматическим вызовом [[деструктор]]ов. При возникновении исключения в блоке необходимо автоматически вызвать деструкторы объектов, созданных в данном блоке, но только тех, которые не были ещё удалены обычным порядком. Кроме того, требование прерывания текущей операции при возникновении исключения вступает в противоречие с требованием обязательного автоматического удаления в языках с автодеструкторами: если исключение возникнет в деструкторе, то либо компилятор будет вынужден удалить не полностью освобождённый объект, либо объект останется существующим, то есть возникнет [[утечка памяти]]. Вследствие этого генерация неперехватываемых исключений в деструкторах в ряде случаев просто запрещается.
 
Джоэль[[Спольски, Джоэл|Джоэл Спольски]] считает, что код, рассчитанный на работу с исключениями, теряет линейность и предсказуемость. Если в классическом коде выходы из блока, процедуры или функции находятся только там, где их явно указал программист, то в коде с исключениями исключение (потенциально) может произойти в любом операторе и анализом самого кода невозможно узнать, где именно исключения могут происходить. В коде же, рассчитанном на исключения, предсказать, в каком месте произойдёт выход из блока кода, невозможно, и любой оператор должен рассматриваться как потенциально последний в блоке, в результате сложность кода возрастает, а надёжность снижается. <ref name="spolski">[http://www.joelonsoftware.com/items/2003/10/13.html]</ref>
 
Также в сложных программах возникают большие «нагромождения» операторов <code>try ... finally</code> и <code>try ... catch</code> (<code>try ... except</code>), если не использовать аспекты.