Двойное исключение (double exception) в C++ возникает, когда при обработке исключения (внутри блока catch) возникает новое исключение до того, как обработка предыдущего завершена. Это приводит к вызову std::terminate.
Примеры ситуаций:
Выброс нового исключения в блоке catch:
cpp
Здесь в блоке catch, который обрабатывает std::runtime_error, выбрасывается новое исключение std::logic_error.
Исключение во время очистки ресурсов в деструкторе в контексте обработки другого исключения:
cpp
Когда risky_func выбрасывает исключение, происходит раскрутка стека. В процессе раскрутки будет вызван деструктор объекта r. Если этот деструктор сам выбросит исключение, пока происходит обработка первого исключения, возникнет двойное исключение.
Исключение в обработчике исключения из-за внутренних ошибок или вызовов функций, выбрасывающих исключения:
cpp
В этом случае, функция process_error, вызванная в блоке catch для обработки первого исключения, сама инициирует второе исключение.
Во всех этих сценариях, поскольку второе исключение возникает до завершения обработки первого (или во время раскрутки стека из-за первого), стандарт C++ требует вызова std::terminate. std::terminate по умолчанию вызывает abort().