Ich weiß, dass die Regel darin besteht, während eines Destruktors NIE zu werfen, und ich verstehe warum. Ich würde es nicht wagen. Aber selbst das C ++ Faq Lite sagt, dass diese Regel in 99% der Fälle gut ist. Was ist das andere 1%, in das sie sich nicht vertiefen?
Link zum C ++ Faq Lite-Aufzählungspunkt beim Werfen von ~ ():
Mach es einfach nicht. Wenn die Sterne und Planeten sich so ausrichten, dass du findest, dass du musst ...
Mach es immer noch nicht.
Wow, ich wollte gerade Juan wählen, bis ich den Teil gesehen habe, der niemals Ausnahmen benutzt.
Okay, zuerst einmal, Juan hat es richtig. Wenn, aus welchem Grund auch immer, Sie in der Situation von zwei Ausnahmen landen, die sich gegenseitig im Stapel jagen, wird C ++ einfach seine Hände und die letzte Mahlzeit hochwerfen und abnormal enden. Das Auslösen einer Ausnahme von einem dtor ist eine Garantie dafür, dass Sie einen möglichen Codepfad haben, der zu einer ungeplanten abnormalen Beendigung führt, was im Allgemeinen eine schlechte Sache ist. Wenn es das ist, was Sie wollen , seien Sie geradeheraus, rufen Sie ab, oder beenden Sie es und bringen Sie es hinter sich.
Der Teil darüber, es zu vermeiden, indem man keine Ausnahmen verwendet, ist jedoch ein schlechter Rat. Ausnahmen sind in C ++ in der Tat ein essenzieller Mechanismus für Systeme, die robust und für eine lange Zeit laufen werden; Sie sind wirklich der einzige Weg, um zu garantieren, dass Sie mit Fehlersituationen umgehen können, ohne Ressourcen auf dem gesamten Boden zu verlieren.
Es passiert, dass ich für Marshall Cline, den Typ, der diese FAQ geschrieben hat, gearbeitet habe und C ++ aus dem FAQ-Buch gelernt habe; deswegen kann ich dir sagen, dass du die Antwort ein wenig falsch interpretierst. Er sagt nicht "Hey, es gibt diesen einen Fall, in dem es okay wäre, aber ich werde dich nicht dazu bringen", sagt er. "Ich bin mir sicher, dass, wenn ich absolut und ausnahmslos sage ' Ich werde eines Tages von einem dtor jemanden ausdenken, der eines Tages ein sinnloses Beispiel vorführt, aber ich weiß es nicht und glaube es nicht wirklich zu Hause, und konsultieren Sie einen Anwalt, keine ausdrückliche oder stillschweigende Garantie. "
Wenn alles so kompliziert ist, dass Sie das Programm über den Ausnahmecodefluss beenden möchten.
Sie müssten garantieren, dass der Destruktor wegen einer anderen Ausnahme nicht aufgerufen wird.
Davon abgesehen verwende ich keine Ausnahmen. Aber wenn ich gezwungen wäre, sie zu benutzen, um meinen Job zu behalten, würde ich nie eine Ausnahme von einem Destruktor werfen.
Sie können eine Ausnahme von einem Destruktor auslösen, wenn dieser Destruktor nicht automatisch während des Abwickelns des Stacks aufgerufen wird, oder das Auslösen der Ausnahme einen Aufruf von terminate () zur Folge hat. Um festzustellen, ob es sicher ist, Ausnahmen von einem Destruktor zu werfen, verwenden Sie die Standardfunktion uncaught_exception (); Wenn sie false zurückgibt, ist es sicher, eine Ausnahme auszulösen
Ich nehme an, Sie könnten eine wirklich schlechte Situation in einem Destruktor zuverlässig erkennen, die so schlecht war, dass es keinen guten Weg gab, damit umzugehen, und Sie mussten sicherstellen, dass der Prozess gestoppt wurde JETZT bevor etwas anderes passiert ist ... (stell dir einen Computer vor, der an eine Kanone oder eine Atomrakete angeschlossen ist), aber zwei andere Gedanken kommen mir in den Sinn:
Anstatt eine Ausnahme auszulösen, wäre es besser, exit () oder abort () oder TerminateProcess () oder etwas, das die Dinge explizit stoppt, aufzurufen, anstatt anzunehmen, dass Sie wissen, was der Compiler macht Ausnahme im Destruktor "in, wenn es kompiliert.
Dies ist eher ein künstliches Beispiel. Extreme Sicherheitsprüfungen sollten in einer echten Funktion ausgeführt werden, die absichtlich zu genau definierten Zeiten (oder besser noch in Hardware oder redundanten Prozessoren) ausgeführt wird und nicht als nachträglicher Einfall während eines Destruktors.
Wenn die Zerstörung Teil eines kontrollierten Prozesses ist, dann wäre es akzeptabel, aber trotzdem müssen Sie die verbleibenden Referenzen so weit wie möglich loswerden, so dass das Werfen nicht gut ist.
Zerstörung kann implizit so oft passieren, dass ein Wurf die normale Code-Logik durchbricht.