Ваш второй пример завершает программу с хорошим сообщением об ошибке (по крайней мере, с помощью g ++ 4.6.1):
terminate called without an active exception
Aborted
Это происходит потому, что вы пытаетесь повторно вызвать исключение, но поскольку активных исключений нет, программа завершает работу.
Текущий черновик c ++ 11 в главе 15.5.1 гласит:
В некоторых ситуациях обработка исключений должна быть прекращена из-за меньшего количества
тонкие методы обработки ошибок.
Тогда в списке случаев, когда вызывается std::terminate
, это:
когда бросающее выражение без операнда пытается отбросить
исключение и исключение не обрабатывается (15.1),
Итак, поведение из вашего второго примера хорошо определено в стандарте.