Mir wurde einmal geraten, dass ein C ++ - Programm letztendlich alle Ausnahmen abfangen sollte. Die Begründung lautete zu der Zeit im Wesentlichen, dass Programme, die es erlauben, dass Ausnahmen außerhalb main()
eines seltsamen Zombie-Zustands auftauchen . Dies wurde mir vor einigen Jahren mitgeteilt, und im Nachhinein glaube ich, dass das beobachtete Phänomen auf die langwierige Erzeugung außergewöhnlich großer Core-Dumps aus dem fraglichen Projekt zurückzuführen war.
Das wirkte damals bizarr, aber überzeugend. Es war völlig unsinnig, dass C ++ Programmierer "bestraft", weil sie nicht alle Ausnahmen abfingen, aber die Beweise vor mir schienen dies zu untermauern. Für das fragliche Projekt schienen Programme, die nicht abgefangene Ausnahmen ausgelöst hatten, in einen seltsamen Zombie-Zustand überzugehen - oder, wie ich jetzt vermute, ein Prozess inmitten eines unerwünschten Core-Dumps ist ungewöhnlich schwer zu stoppen.
(Für alle, die sich fragen, warum dies zu dieser Zeit nicht offensichtlicher war: Das Projekt erzeugte eine große Menge an Ausgaben in mehreren Dateien aus mehreren Prozessen, die jede Art von aborted (core dumped)
Nachricht effektiv verdeckten , und in diesem speziellen Fall war die Post-Mortem-Untersuchung von Core-Dumps nicht möglich Es ist keine wichtige Debugging - Technik, daher wurde nicht viel über Core - Dumps nachgedacht. Probleme mit einem Programm hingen normalerweise nicht vom Zustand ab, der von einem langlebigen Programm im Laufe der Zeit aus vielen Ereignissen angesammelt wurde, sondern von den anfänglichen Eingaben in ein kurzlebiges Programm (< 1 Stunde), daher war es praktischer, ein Programm mit denselben Eingaben aus einem Debugbuild oder in einem Debugger erneut auszuführen, um weitere Informationen zu erhalten.)
Derzeit bin ich mir nicht sicher, ob es einen großen Vorteil oder Nachteil gibt, Ausnahmen nur zu fangen, um das Verlassen von Ausnahmen zu verhindern main()
.
Der kleine Vorteil, den ich mir vorstellen kann, main()
wenn ich zulasse, dass Ausnahmen in die Vergangenheit sprudeln, ist, dass das Ergebnis std::exception::what()
auf dem Terminal gedruckt wird (zumindest mit GCC-kompilierten Programmen unter Linux). Auf der anderen Seite ist dies trivial zu erreichen, indem stattdessen alle Ausnahmen abgefangen std::exception
und das Ergebnis gedruckt werden. std::exception::what()
Wenn es wünschenswert ist, eine Nachricht von einer Ausnahme zu drucken, die nicht von std::exception
dieser Ausnahme stammt, muss sie vor dem Verlassen abgefangen main()
werden, um gedruckt zu werden die Nachricht.
Der bescheidene Nachteil, den ich mir main()
vorstellen kann, um Ausnahmen zuzulassen, ist, dass unerwünschte Kerndumps erzeugt werden können. Bei einem Prozess, der viel Arbeitsspeicher benötigt, kann dies ziemlich ärgerlich sein, und für die Steuerung des Core-Dump-Verhaltens in einem Programm sind betriebssystemspezifische Funktionsaufrufe erforderlich. Wenn andererseits ein Core-Dump und ein Exit gewünscht werden, kann dies stattdessen jederzeit durch Aufrufen erreicht werden, std::abort()
und ein Exit ohne Core-Dump kann jederzeit durch Aufrufen erreicht werden std::exit()
.
Anekdotischerweise glaube ich nicht, dass ich jemals die Standardnachricht gesehen habe, die what(): ...
von einem weit verbreiteten Programm nach einem Absturz gedruckt wurde.
Was sind, wenn überhaupt, die starken Argumente dafür oder dagegen, dass C ++ - Ausnahmen in die Vergangenheit sprudeln main()
?
Bearbeiten: Auf dieser Website gibt es viele allgemeine Fragen zur Ausnahmebehandlung. Meine Frage bezieht sich speziell auf C ++ - Ausnahmen, die nicht behandelt werden können und es bis jetzt geschafft haben. main()
Vielleicht kann eine Fehlermeldung gedruckt werden, aber es handelt sich um einen Fehler, der sofort angezeigt wird.