In jeder meiner Hauptfunktionen möchte ich bestimmte Klassen von Ausnahmen abfangen und in Exit-Codes konvertieren.
Gibt es eine elegantere Lösung als das Starten und Beenden jeder Hauptfunktion mit Makros, die den impliziten try {} catch
einfügen, den ich möchte?
Kann ich das irgendwie mit der Funktionalität std::set_terminate
erreichen?
Beispiel:
%Vor%Ein sauberer Weg beinhaltet die Verwendung einer Übersetzungsfunktion mit all Ihre Exception-Muster, die die Exit-Werte für die entsprechende Ausnahme zurückgeben.
%Vor%In Ihrem eigenen Code geht es nur darum, Ihre Geschäftslogik mit einem Lambda zu umhüllen und in die Übersetzungsfunktion zu übernehmen, damit sie für Sie erfassen und übersetzen kann.
%Vor%Normalerweise mache ich das:
%Vor%Sie können natürlich mehr Catch-Handler haben.
Wenn Sie die gleiche Liste von Catch-Handlern in mehrere Einstiegspunkte einfügen müssen, wäre das eine andere Frage. Die Lösung dort ist catch(...) { foo(); }
, wobei% foo()
auf try { throw; }
folgt, gefolgt von allen Catch-Handlern.
Ich bezweifle es. Zu dem Zeitpunkt, zu dem terminal aufgerufen wird, haben Sie bereits alle Ausnahmeinformationen verloren (genauer gesagt, Sie hatten es nie - terminate wird aufgerufen, wenn keine Handler verfügbar sind und dann die Bestimmung an der Call-Site erfolgt). Ein Exception-Objekt wird nicht einmal erstellt, wenn es keinen passenden Handler dafür gibt.
Die sauberste Lösung , die ich kenne, sieht so aus:
%Vor% Um Handler außerhalb des allgemeinen Handlers zu haben, muss Ihr gewöhnlicher Handler entweder auf einen bekannten Typ operieren (zB catch (...)
auf catch (const my_exception& ex)
ändern und erforderliche Änderungen innerhalb des allgemeinen Handlers vornehmen) oder verschachtelt verwenden try
Blöcke:
Ich kann es noch verfeinern, aber ich habe herausgefunden, dass ich es kann
std::terminate
tut, um das zu drucken
what():
-Zeile für std::exception
s ) main
gar nicht davon weiß Damit müssen meine main
s nicht über diese Ausnahme-zu-Exitcode-Übersetzung "wissen", was mein Ziel war:
Danke an alle für die guten Ideen.