Ist es in Ordnung, einfach throw;
vom Konstruktor aufzurufen, wenn etwas schief läuft und Sie keine Ahnung haben, wie Sie es wiederherstellen können?
Die Idee ist, die App mit einem Dump abstürzen zu lassen, da der Status unbekannt ist. Oder sollten Sie immer ein Argument angeben?
Von MSDN habe ich nur gefunden, dass es erneut springt, wenn es kein Argument gibt, aber keine Ahnung, was passiert, wenn es keine anfängliche Ausnahme zum erneuten Durchlaufen gibt.
Wenn momentan keine Ausnahme verarbeitet wird, führt throw;
dazu, dass terminate()
sofort aufgerufen wird und das endet Ihr Programm abnormal. Das ist nicht sehr praktisch - Sie werden weniger Informationen darüber haben, was passiert ist, als eine sinnvolle Ausnahme zu werfen. Sie hätten eine sinnvolle Ausnahme auslösen können, fangen Sie es auf der obersten Ebene (wie main()
), schreiben Sie einige Diagnosen und dann das Programm zu beenden.
Nein. throw;
ist eine spezielle Syntax, die die aktuelle Ausnahme erneut auslöst. Es macht nur Sinn innerhalb von catch
Blöcken (oder Code, der von einem aufgerufen wird) fortzufahren, um die Ausnahme fortzuführen.
Verwenden Sie einfach:
%Vor%oder auch nur
%Vor%aber das später ist hässlicher zu handhaben und gerade allgemein verpönt.
Während Sie es technisch nennen können, wird es nicht tun, was Sie wollen.
Die einfachste Lösung ist, throw std::runtime_exception("thrown from Foo");
aufzurufen, was gleichzeitig eine Rückmeldung darüber gibt, was vor sich ging.
Wenn Sie sagen "keine Ahnung, wie Sie sich erholen", was Sie meinen, nehme ich an, dass Sie an dieser Stelle nicht wissen, wie Sie mit dem Fehler umgehen sollen?
Vielleicht bekommen Sie nicht den Sinn von Ausnahmen. Sie werfen Informationen: dass die Ausnahme aufgetreten ist und warum. Der Call-Stack wird dann bis zu dem Punkt abgewickelt, an dem er behandelt werden kann. An diesem Punkt im Code wissen wir, wie, wenn möglich, wiederherzustellen.
Technisch gesehen können Sie das tun, weil throw ohne Argument und ohne eine aktive Ausnahme nur terminate()
aufruft, was standardmäßig abort()
aufruft. Ich rufe lieber abort()
direkt an, es erfordert weniger kognitive Anstrengungen, um zu erkennen, was vor sich geht.
Tags und Links c++