Der herkömmliche Weg zum Auslösen und Abfangen von Ausnahmen besteht darin, ein Ausnahmeobjekt zu werfen und es als Referenz abzufangen (normalerweise const
Referenz). Die Sprache C++ erfordert, dass der Compiler den entsprechenden Code generiert, um das Ausnahmeobjekt zu konstruieren und es zu gegebener Zeit ordnungsgemäß zu bereinigen.
Einen Zeiger auf ein dynamisch zugewiesenes Objekt zu werfen ist nie eine gute Idee. Ausnahmen sollen Ihnen ermöglichen, robusteren Code angesichts von Fehlerbedingungen zu schreiben. Wenn Sie ein Exception-Objekt auf die herkömmliche Art und Weise werfen, können Sie sicher sein, ob es durch eine catch-Klausel, die den korrekten Typ nennt, von einer catch (...)
abgefangen wird, ob es dann erneut geworfen wird oder nicht, es wird zur richtigen Zeit korrekt zerstört . (Die einzige Ausnahme ist, wenn sie überhaupt nicht abgefangen wird, aber dies ist eine nicht behebbare Situation, egal wie man sie betrachtet.)
Wenn Sie einen Zeiger auf ein dynamisch zugewiesenes Objekt werfen, müssen Sie sicher sein, dass was auch immer Call-Stack sieht aus wie an dem Punkt, an dem Sie Ihre Ausnahme auslösen möchten, gibt es einen catch-Block, der den richtigen Zeigertyp nennt und den entsprechenden Aufruf delete
hat.Ihre Exception darf niemals von abgefangen werden, es sei denn, dieser Block löst die Ausnahme erneut aus, die dann von einem anderen catch-Block abgefangen wird, der die Ausnahme korrekt behandelt.
Effektiv bedeutet dies, dass Sie die Funktion zur Ausnahmebehandlung verwendet haben, die es einfacher macht, robusten Code zu schreiben, und es sehr schwer macht, in allen Situationen korrekten Code zu schreiben. Dies schließt das Problem aus, dass es fast unmöglich ist, als Bibliothekscode für Client-Code zu fungieren, der diese Funktion nicht erwartet.
Ich denke 'throw gcnew' wäre nützlich z. Wenn Sie möchten, dass verwalteter Code Ihre Ausnahme abfängt. Kann mich das jemand korrigieren? – jpalecek
.Net befasst sich mit Ausnahmen durch Zeiger, so dass Throw gcnew das Richtige ist, um dort zu tun. –
@SebastianRedl .Net "Zeiger" kann mehrdeutig sein? Obwohl GCNEW sicherlich nicht ist. "System :: Exception" ist im Allgemeinen ein Verweis auf ein verwaltetes Objekt auf dem Garbage Collected Heap. Ich habe immer mit 'gcnew' geworfen und mit' System :: Exception^'abgefangen. Natürlich benutze ich 'finally' die ganze Zeit auch in C++/CLI, obwohl ich nicht oft mit C++ Ausnahmen im selben' try' Block mische, ich bin mir nicht sicher warum. –