Если исключение не учтено, то стандарт не определяет, будет ли стек разматываться. Таким образом, на некоторых платформах будут вызываться деструкторы, а на других программа будет остановлена немедленно. Ловля на верхнем уровне гарантирует, что деструкторы всегда вызываются.
Так что, если вы не работаете под отладчиком, возможно, будет разумно отлавливать все: (...), а также std :: exception. Тогда код вашего приложения можно очистить с помощью RAII даже при фатальном исключении. Во многих таких случаях вам на самом деле не нужно убирать, так как ОС сделает это за вас. Но, например, вы можете предпочесть отключаться от удаленных сервисов везде, где это возможно, и могут существовать ресурсы, внешние по отношению к процессу, такие как именованные каналы / мьютексы, которые вы предпочитаете уничтожать, а не вытекать.
Повторное исключение в main кажется мне ограниченным, поскольку вы уже потеряли контекст, в котором оно было изначально выброшено. Я полагаю, что отлов неперехваченного исключения в отладчике является более шумным, чем просто запись ошибки в std :: cerr, поэтому повторное создание было бы разумным шагом, если есть вероятность пропустить запись.
Если вы хотите, чтобы отладчик перехватывал непредвиденные условия в режиме отладки, который в режиме выпуска вызывает исключение, которое в конечном итоге приводит к выходу, то есть другие способы сделать это, кроме как оставить исключение необработанным, чтобы отладчик его увидел. Например, вы можете использовать макрос assert. Конечно, это не помогает в непредвиденных и непредсказуемых условиях, таких как аппаратные исключения, если вы используете SEH в .NET.