Die herkömmliche Methode zum Auslösen und Abfangen von Ausnahmen besteht darin, ein Ausnahmeobjekt auszulösen und es als Referenz (normalerweise als const
Referenz) abzufangen. Die C ++ - Sprache erfordert, dass der Compiler den entsprechenden Code generiert, um das Ausnahmeobjekt zu erstellen und es zum richtigen Zeitpunkt ordnungsgemäß zu bereinigen.
Es ist niemals eine gute Idee, einen Zeiger auf ein dynamisch zugewiesenes Objekt zu werfen. Ausnahmen sollen es Ihnen ermöglichen, angesichts von Fehlerbedingungen robusteren Code zu schreiben. Wenn Sie ein Ausnahmeobjekt auf herkömmliche Weise auslösen, können Sie sicher sein, dass es zum richtigen catch (...)
Zeitpunkt korrekt zerstört wird , wenn es von einer catch-Klausel mit dem Namen des richtigen Typs abgefangen wird , ob es dann erneut ausgelöst wird oder nicht. (Die einzige Ausnahme ist, wenn es nie gefangen wird, aber dies ist eine nicht behebbare Situation, wie auch immer Sie es betrachten.)
Wenn Sie einen Zeiger auf ein dynamisch zugewiesenes Objekt werfen, müssen Sie sicherstellen, dass unabhängig davon, wie der Aufrufstapel an dem Punkt aussieht, an dem Sie Ihre Ausnahme auslösen möchten, ein catch-Block vorhanden ist, der den richtigen Zeigertyp benennt und den entsprechenden delete
Aufruf hat. Ihre Ausnahme darf niemals abgefangen werden, es catch (...)
sei denn, dieser Block löst die Ausnahme erneut aus, die dann von einem anderen catch-Block abgefangen wird, der die Ausnahme korrekt behandelt.
Tatsächlich bedeutet dies, dass Sie die Ausnahmebehandlungsfunktion verwendet haben, die das Schreiben von robustem Code erleichtern und es sehr schwierig machen soll, Code zu schreiben, der in allen Situationen korrekt ist. Abgesehen von dem Problem, dass es fast unmöglich sein wird, als Bibliothekscode für Client-Code zu fungieren, der diese Funktion nicht erwartet.
throw gcnew
wäre nützlich zB. Wenn Sie möchten, dass verwalteter Code Ihre Ausnahme abfängt. Kann mich jemand korrigieren?