что происходит, когда возникают два исключения? - PullRequest
5 голосов
/ 13 марта 2010

что поведет себя программа, когда у них есть два исключения. И никто из них еще не был пойман. какой тип обработчика будет вызван. допустим, оба исключения были разного типа. Я прошу прощения, если мне не ясно, но я чувствую, что прояснил себя достаточно. спасибо !!!

что если блок try выдает исключение, и блок try завершается, что уничтожает все автоматические переменные. Допустим, один из них был автоматическим объектом, а его деструктор снова выдал исключение. Теперь у нас есть два необработанных исключения. Мой вопрос основан на этот факт. спасибо !!

Ответы [ 4 ]

6 голосов
/ 13 марта 2010

Это полностью зависит от языка. Тем не менее, на всех языках, которые я знаю, никогда не может быть несколькими исключениями одновременно (в одном потоке). Если было сгенерировано исключение, оно перемещается вверх по стеку вызовов, пока не будет перехвачено, без выполнения кода в течение этого времени. Если исключение не перехвачено, программа завершает работу, прежде чем может быть выдано другое. Если оно перехвачено, исключение больше не является «активным», а если обработчик выдает новое исключение, старое забывается.

5 голосов
/ 13 марта 2010

На уровне ЦП (на x86) существует ситуация, называемая двойной отказ :

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

Тем не менее, этот тип «двойной ошибки» является ситуацией очень низкого уровня и касается только ядра операционной системы.

0 голосов
/ 24 января 2014

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

В противном случае нормальное поведение в C ++ состоит в том, чтобы резко сбить систему, когда исключение происходит во время очистки от другого исключения; Языки Java и .NET обычно отказываются от любых ожидающих исключений, если происходит исключение очистки. Новые версии Java, однако, включают функцию, которая (если используется) будет обрабатывать такие вещи намного лучше. В блоке try-with-resources исключение, которое возникает при очистке ресурсов, когда другие исключения не ожидают обработки, будет обрабатываться нормально; однако, если исключение находилось в состоянии ожидания, ожидающее исключение останется в состоянии ожидания, но новое исключение будет добавлено в его список «исключенных исключений». Было бы неплохо, если бы был способ указать, что определенный блок finally должен вести себя так же, но я не знаю какой-либо функции для этого.

0 голосов
/ 24 января 2014

Когда возникает Исключение, компилятор раскручивает стек (закрытие текущих функций и переход назад, функция вызова). Если исключение не обнаружено в main, то complier вызвал функцию abort. По этой программе аварийно завершается.

Но во время разматывания стека, если произошло другое исключение (для вашего случая в деструкторе), чем в этот момент / момент без достижения основной функции, компилятор вызвал функцию abort, которая аварийно завершает программу.

Если вы знаете, что в деструкторе может возникнуть исключение, вы должны обработать его в деструкторе. Значит, в деструкторе должен быть блок catch, чтобы перехватить это исключение. Таким образом, второе сгенерированное исключение должно быть обработано в деструкторе, и это исключение не выводится из деструктора, и программа должна быть спасена от сбоя из-за двух сгенерированных исключений одновременно

Complier обрабатывает только одно исключение за раз. Если компилятор находит более одной функции исключения вызова, исключение из которой программа аварийно завершает.

...