std::current_exception



  • Ich wollte mal eure Meinung zur

    http://en.cppreference.com/w/cpp/error/current_exception

    hören. Hat jemand hier schon davon Gebrauch gemacht? Wofür könnte man das gut einsetzen? Ich habe schon gelesen, dass ein Einsatzgebiet Multithreading wäre, wo ein Thread alle auftretenden Exceptions sammelt und so dem anderen Thread übergibt (der das dann meldet oder sowas).


  • Mod

    Ich habe es neulich tatsächlich mal benutzt. Anwendungsgebiet war eine Anwendung mit einer globalen Ressource, bei der es absolut kritisch war, dass diese bei Programmende freigegeben wird. Daher habe ich einen eigenen terminate-Handler gebraucht. In diesem Handler habe ich dann current_exception genutzt, um eine brauchbare Fehlermeldung abgeben zu können.

    (Ich musst dann leider feststellen, dass man im Falle des GCC eine halbwegs aktuelle Version benötigt, damit current_exception eine Signatur nach Standardspezifikation hat, was es nötig machte, auf einigen der Produktivsystemen erst einmal eine neue Version selber zu compilieren, was durchaus stressig ist. Aber das kann man der armen current_exception nicht zum Vorwurf machen, sondern eher dem Admin dieser Systeme, der anscheinend denkt, GCC 4.4 wäre im Jahr 2015 noch ein akzeptabler Compiler.)



  • @Ausnahme5000
    Hab's noch nie verwendet weil ich noch mit einem 10 Jahre alten Compiler arbeiten muss 😞
    Aber ich hätte es schon mehrfach verwendet, wenn ich die Möglichkeit gehabt hätte.

    Klassischer Anwendungsfall ist tatsächlich Multithreading.
    Angenommen du lagerst bestimmte Berechnungen in einen Worker-Thread aus (oder mehrere). Angenommen bei den Berechnungen in den Worker Threads geht etwas schies (Exception). Und angenommen du willst dass sich für den Aufrufer deiner Funktion nichts ändert, d.h. dass im Fehlerfall da einfach die Exception rausgeflogen kommt.
    Dann musst du die Exception im Worker-Thread fangen können, in den Thread der den Worker gestartet hat transportieren, und dort wieder werfen können.
    Und dann verwendest du current_exception .

    Anderer möglicher Anwendungsfall: Error-Logging. Also was SeppJ beschrieben hat, nur nicht unbedingt auf std::terminate beschränkt.


Anmelden zum Antworten