Loggerklasse soll App bei kritischem Error beenden



  • Ich habe eine Anwendung gebastelt die eine Loggerklasse hat. 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.

    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?

    Problem ist ja, dass beim setzen einer Variable in einer statischen Methode, die Instanz in der Anwendung nicht davon mitbekommen würde. Richtig?



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



  • manni66 schrieb:

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

    Stell dich nicht so blöd...

    Ich möchte die Loggerklasse in meiner Anwendung, also der Mainklasse, instanzieren. Damit ich bei jedem Loop der Anwendung überprüfen kann ob die Loggerklasse eine kritische Meldung registriert hat. Da ich beim loggen statische Methoden benutze, wird das recht schwierig.

    Ich mag das so lieber, als überall im Programmcode Funktionen zu basteln, die meine Anwendung beenden, wenn eine wichtige Programmfunktion fehlschlägt.



  • Bennisen schrieb:

    Stell dich nicht so blöd...

    Viel Spaß mit deinem Problem...



  • manni66 schrieb:

    Bennisen schrieb:

    Stell dich nicht so blöd...

    Viel Spaß mit deinem Problem...

    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.

    Hab jetzt einfach nochmal alles erklärt und hoffe es ist verständlich.


  • 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.


Log in to reply