Существует только одно «активное исключение» одновременно. Когда вы throw
делаете еще одно исключение в обработчике исключений, фактически вы меняете тип исключения, которое распространяется по стеку.
(Кстати, все ли это необходимо? Вы действительно находите этот код легко читаемым?)
[обновление]
Что касается стандартной ссылки ... ИСО / МЭК 14882: 2003, раздел 15.3 [кроме ручки], пункт 8 гласит:
Исключение считается обработанным при входе в обработчик. [Обратите внимание
стек будет размотан в этот момент. ]
Итак, еще один способ сказать, что как только вы входите в блок catch
, исходное исключение больше не активно.
Кроме того, функция uncaught_exception()
вернет false
, как только будет введен блок catch
. Раздел 15.5.3 [исключая .uncaught] гласит:
Функция
bool uncaught_exception() throw()
возвращает true после завершения оценки объекта, который должен быть брошен, до завершения
инициализация объявления исключения в соответствующем обработчике
(18.6.4). Это включает в себя разматывание стека. Если исключение переброшено
(15.1), uncaught_exception () возвращает истину с точки повторного броска
пока вновь возникшее исключение не будет поймано снова.
[обновление 2]
Также актуален пункт 15.3 параграфа 4:
Память для временной копии создаваемого исключения:
распределяется неопределенным образом, за исключением случаев, указанных в 3.7.3.1.
временно сохраняется до тех пор, пока выполняется обработчик для
это исключение. В частности, если обработчик завершает работу, выполняя
throw;
оператор, который передает управление другому обработчику для того же
исключение, поэтому временное остается. Когда последний обработчик
выполнено для исключений выходит любым способом, кроме throw;
временный объект уничтожен и реализация может быть освобождена
память для временного объекта; любое такое освобождение делается в
неуказанный способ. Разрушение происходит сразу после
уничтожение объекта, заявленного в декларации-исключении в
обработчик.
Таким образом, исходное исключение уничтожается, как только завершается работа с обработчиком любым другим способом, кроме «голого» * 1041 *. Так что если вы throw
какое-то другое исключение, оно выходит из обработчика и уничтожает исходное исключение.