Loggerklasse soll App bei kritischem Error beenden


  • Mod

    Exception werfen?



  • SeppJ schrieb:

    Exception werfen?

    Du meinst beim auftreten des Fehlers eine Exception werfen? Oder meinst du das in Verbindung mit der Loggerklasse?



  • Wie wäre es mit dem Pendant zu statischen Funktionen - nämlich statischen Variablen? 😉



  • Ist es nicht so, dass, wenn ich die statische Variable in einer Klasse setze, sie in einer anderen Klasse einen anderen Wert hat?

    Hatte gelesen, dass statische Variablen immer an die Klasse gebunden sind, wo sie gesetzt wurden.



  • Bennisen schrieb:

    Ich habe eine Anwendung gebastelt die eine Loggerklasse hat. Die Loggerklasse hat 1 statische Methode um Meldungen in Logdateien zu schreiben.

    Und für mehr sollte diese Klasse auch nicht verantwortlich sein! Sie soll loggen, mehr nicht. Schon mal etwas vom Single-Responsibility-Prinzip (SRP) gehört?

    Bennisen schrieb:

    Ich möchte aber, wenn ein kritische Meldung auftritt, dass die Anwendung beendet wird.

    Ist es möglich in der Anwendung die Loggerklasse zu deklarieren und bei jedem Apploop in der Loggerklasse eine Variable zu überprüfen, ob eine kritische Meldung aufgetreten ist?

    Ich würde die Entscheidung, was bei einem Fehler passieren soll, nicht bei der Logger-Klasse lassen und auch nicht an der Stelle, wo der Fehler passiert. Sondern dort, wo der Fehler abgefangen (catch-Block) oder abgefragt (Error-Return-Code mittels if-Abfrage) wird.

    Ein Vorschlag:

    // header fuer exit() und abort()
    #include <cstdlib>
    
    void foo()
    {
      try {    
        // irgendwas geht schief
      }
      catch(const weniger_schlimm_exception &ex)
      {
         my_logger::error("fehler in sowieso!");
         return; // kein Programm-Ausstieg
      }
      catch(...)
      {
         my_logger::error("Weltuntergang!");
         std::exit(EXIT_FAILURE); // Programm-Ausstieg!
      }
    }
    

    Siehe:
    http://www.cplusplus.com/reference/cstdlib/exit/
    http://www.cplusplus.com/reference/cstdlib/abort/



  • hmm ok, dann muss ich doch ein weniger mehr verändern und mehr code schreiben. vielen dank



  • Bennison schrieb:

    Die Loggerklasse hat 1 statische Methode um Meldungen in Logdateien zu schreiben. Ich möchte aber, wenn ein kritische Meldung auftritt, dass die Anwendung beendet wird.

    Du möchtest das Programm also beenden, sobald ein kritischer Status erreicht wurde? Wie ich das verstanden habe, hast du sowas wie logger::critical(const std::string& ) . Das heißt doch eigentlich nur, dass du innerhalb der Funktion, nach dem loggen des Fehlers natürlich, das Programm beenden kannst. Das machst du dann entweder mit std::exit() oder std::terminate oder du wirfst eine eigene Exception die nie aufgefangen wird.

    Oder was hindert dich daran, das Programm direkt in der nächsten Zeilen nach dem loggen der kritischen Nachricht zu beenden?

    Willst du das Programm etwa ordnungsgemäß mit Null returnen? Das ginge dann am einfachsten mit einer selbstgemachten Exception wäre bei einem kritischen Fehler aber irgendwie semantisch nicht korrekt. Bei einem kritischen Fehler wär ich dann noch eher fürs abschießen.



  • class MyLogger
    {
    public:
        static void LogInfo(char const* blah) {...}
        static void LogError(char const* blah) {...}
        static void LogCriticalErrorAndExit(char const* blah)
        {
            LogError(blah);
            LogInfo("Kthxbye.");
            TerminateMyProcess();
        }
    };
    

    ?

    Bennisen schrieb:

    manni66 schrieb:

    Was hat "Programm beenden" mit "Variable setzen" zu tun?
    Was ist "Apploop"?
    Was ist "mitbekommen "?

    Stell dich nicht so blöd...

    Nene, das Problem liegt schon bei dir. Du drückst dich viel zu unklar aus und wirst dann patzig wenn man dich darauf hinweist. Damit geht die Motivation dir helfen zu wollen gegen null.

    Bennisen schrieb:

    eingeschnappt?

    Hab eher das Gefühl, dass du meine Worte eher nicht verstanden hast, als das Problem an sich. Also erstmal an der Wortwahl rummeckern. Und dann auf beleidigt machen.

    Du lebst schon sehr in deiner eigenen Welt, oder?
    Ja, er hat nicht verstanden was du sagen wolltest. Was daran liegt dass du wirr/unklar schreibst. Also hat er nachgefragt. Darauf kommt aber keine Antwort sondern ein "stell dich nicht so blöd". Und jetzt überleg dir nochmal wer hier einen auf beleidigt macht und wo das Kommunikationsproblem hier entsteht.



  • Bennisen schrieb:

    Ist es nicht so, dass, wenn ich die statische Variable in einer Klasse setze, sie in einer anderen Klasse einen anderen Wert hat?

    Hatte gelesen, dass statische Variablen immer an die Klasse gebunden sind, wo sie gesetzt wurden.

    Wie meinen? Wenn du eine Klasse Foo mit einer statischen Variable bar hast dann hat Foo::bar im gesamten Programm den gleichen Wert.



  • Ethon schrieb:

    Bennisen schrieb:

    Ist es nicht so, dass, wenn ich die statische Variable in einer Klasse setze, sie in einer anderen Klasse einen anderen Wert hat?

    Hatte gelesen, dass statische Variablen immer an die Klasse gebunden sind, wo sie gesetzt wurden.

    Wie meinen? Wenn du eine Klasse Foo mit einer statischen Variable bar hast dann hat Foo::bar im gesamten Programm den gleichen Wert.

    Vielleicht war das im Zusammenhang mit DLL/SO?


  • Mod

    Bennisen schrieb:

    SeppJ schrieb:

    Exception werfen?

    Du meinst beim auftreten des Fehlers eine Exception werfen? Oder meinst du das in Verbindung mit der Loggerklasse?

    Wenn eine Ausnahmesituation auftritt, dann wirft man eine Exception. Wenn die Ausnahme derart kritisch ist, dass niemand in der Lage ist, diese zu behandeln, dann wird damit letztlich das Programm terminiert. Von wo aus das geschieht ist an sich erst einmal völlig egal, diese Vorgehensweise ist unabhängig von deinen Überlegungen die richtige.

    Deine Beschreibung klingt danach, als würden gewisse Vorgänge in deinem Logger zu einer Ausnahmesituation führen. Das heißt, von dort aus sollte eine entsprechende Exception geworfen werden und der Rest deines Programms sollte deiner Beschreibung nach nicht in der Lage sein, diese Exception zu fangen (außer eventuell in der obersten Ebene) und es wird somit letztlich zum Programmabbruch kommen.

    Die wesentlichen Unterschiede gegenüber anderen Verfahren und ganz besonders dem, was du dir mit deinem "Apploop", "Variablen setzen" usw. vorzustellen scheinst:
    -Das Verfahren benötigt anderswo im Programm keinerlei Änderungen.
    -Es führt keinen globalen Zustand und keine Abhängigkeiten ein.
    -Das Programm wird sauber abgewickelt, anstatt es hart abzuschießen.
    -Wenn du doch einmal sinnvoll auf solch ein Ereignis reagieren möchtest (z.B. Dialogbox mit Fehlernummer), dann ist das ebenfalls kein Problem und führt immer noch keine Abhängigkeiten oder globale zustande ein.


Anmelden zum Antworten