Благодарность за этот ответ принадлежит @HolyBlackCat, который намекнул на это в своем ответе.
Ответ throw
- это сложный процесс, в котором C ++ во время выполнения должен выполнить несколько различных действий. Хотя фактический процесс может быть определен реализацией во время выполнения, но мало что может быть понято совместно. Эта бумага может пролить немного света. См. Раздел 3.3.
. В процессе обслуживания throw
начинается поиск подходящего catch
. Это само по себе может вызвать раскручивание текущего кадра стека. Побочный эффект от разворачивания стекового фрейма состоит в том, что вызываются соответствующие деструкторы для объектов в текущем фрейме. Это действие вызова деструктора снова приводит к выполнению во время выполнения в пользовательской области кода (небезопасно). После того, как это будет сделано, мы снова войдем в среду выполнения (более безопасную).
Наконец, когда введен подходящий catch
, активное исключение уничтожается, и он начинает выполнять код обработчика. По этой причине throw
, как показано в вопросе, не будет испытывать никаких активных исключений.
Это также объясняет, почему мы не должны throw
исключение из деструктора, который выходит из области видимости. На самом деле было бы неплохо иметь блок try{....}catch(...)
в деструкторе для защиты от любых нежелательных terminate
() инцидентов.