Ein impliziter Versuch {} catch around main

8

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%     
PSkocik 08.12.2015, 19:52
quelle

6 Antworten

6

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%     
Snowhawk 08.12.2015, 21:19
quelle
1

Ich denke, Sie könnten etwas mit Makros machen, wenn Sie wollen. Hier ist wie:

%Vor%

Die Idee ist, das Makro einen Versuch schreiben zu lassen, "um" den Hauptfunktionskörper zu fangen, der alles legal ist.

%Vor%

kleines Beispiel live

    
Hiura 08.12.2015 20:22
quelle
1

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.

    
M.M 08.12.2015 20:46
quelle
0

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.

    
SergeyA 08.12.2015 20:06
quelle
0

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:

%Vor%     
Max Lybbert 09.12.2015 03:07
quelle
0

Ich kann es noch verfeinern, aber ich habe herausgefunden, dass ich es kann

  • play rethrow-catch im Abbruch-Handler  ( was ist tatsächlich was std::terminate tut, um das zu drucken    what(): -Zeile für std::exception s )
  • setze den Terminierungs-Handler von außen, so dass main gar nicht davon weiß

Damit müssen meine main s nicht über diese Ausnahme-zu-Exitcode-Übersetzung "wissen", was mein Ziel war:

%Vor%

Danke an alle für die guten Ideen.

    
PSkocik 13.12.2015 21:24
quelle

Tags und Links