Wenn eine Ausnahme nicht abgefangen wird, definiert der Standard nicht, ob der Stapel abgewickelt wird. So werden auf einigen Plattformen Destruktoren aufgerufen, und bei anderen wird das Programm sofort beendet. Das Abfangen auf der obersten Ebene stellt sicher, dass Destruktoren immer aufgerufen werden.
Also, wenn Sie nicht unter dem Debugger laufen, ist es wahrscheinlich klug, alles zu fangen: (...) sowie std :: Ausnahme. Dann kann Ihr Anwendungscode selbst bei einer schwerwiegenden Ausnahme mit RAII aufräumen. In vielen Fällen müssen Sie nicht wirklich aufräumen, da das Betriebssystem dies für Sie erledigt. Sie ziehen es jedoch vor, wenn möglich, sauber von Remote-Diensten zu trennen, und möglicherweise befinden sich außerhalb des Prozesses Ressourcen wie Named Pipes/Mutexes, die Sie lieber zerstören als auslecken möchten.
Das Auftauchen der Ausnahme in main scheint mir von begrenztem Nutzen, da Sie bereits den Kontext verloren haben, in dem es ursprünglich geworfen wurde. Ich nehme an, dass das Auffangen einer nicht abgefangenen Ausnahme im Debugger lauter ist, als nur den Fehler in std :: cerr zu protokollieren, also wäre das erneute Abrufen der intelligente Zug, wenn es eine Chance gibt, die Protokollierung zu verpassen.
Wenn der Debugger unerwartete Bedingungen im Debugmodus abfangen soll, die im Freigabemodus eine Ausnahme auslösen, die schließlich zu einem Exit führt, gibt es andere Möglichkeiten, als die Ausnahme nicht abgefangen zu lassen, damit der Debugger sie sieht .Zum Beispiel könnten Sie Assert-Makros verwenden. Natürlich hilft das nicht bei unerwarteten und unvorhersehbaren Bedingungen, wie Hardware-Ausnahmen, wenn Sie SEH auf .NET verwenden.
Wie kann es verschluckt werden? Der Code gibt die Ausnahmebedingungsnachricht aus und wird dann beendet. Was kannst du noch tun? Wenn Sie die Ausnahme wiederholen, wer würde es sehen? Wo würde es gefangen werden? Dies ist immerhin der Einstiegspunkt des Programms. – jalf