Sollte der Caller oder Callee loggen?



  • Hallo!

    Ich habe eine Designfrage. Ich habe recht oft folgende Codestruktur:

    bool readFile(...) {
    
       // File parsing Code
       if(...) {
            // Dieser Block wird nur betreten, wenn die Datei korrupt ist
            // Hier loggen?
            return false;
       }
    
       if(..) {  // Anderen Fehler in Datei entdeckt
            // Hier loggen?
            return false;
       }
    
       return false;
    }
    

    Meine Frage steht im Grunde im Code. Ich parse z.B. eine Datei und es können viele Fehler auftreten. Im Fehlerfall kann ich nicht weiterarbeiten und gebe false zurück. Die Frage: Sollte ich VOR dem return false in der Funktion den Fehler loggen, oder sollte ich das Loggen dem Caller überlassen, sprich:

    if(!readFile(...) {
       return -1;  // Fehlerfall. Brauche hier nicht loggen, da in readFile schon geloggt wurde
    }
    
    // oder so:
    if(!readFile(...) {
      log("Corrupt file..."); // Hier loggen. In readFile() dafür garnix loggen
      return -1;
    }
    

    Was ist besser?



  • Ich würde es an deiner Stelle dem Caller überlassen. Und wenn du es in die Funktion einbaust, dann mit einem Makro umhüllt.



  • Ich würde in readFile loggen. Innerhalb kannst du dazuschreiben was genau schief gegangen ist. Ausserhalb nicht mehr, zumindest nicht mehr so einfach.
    Und innerhalb schreibst du den Code nur 1x, ausserhalb u.u. zigfach.



  • Auf der einen Seite hast du in der Funktion mehr Informationen darüber, was kaputtgegangen ist, von daher kannst du dort natürlich auch detailliertere Informationen liefern (der Aufrufer sieht nur die Rückgabe false und kann feststellen, daß dort ein Fehler aufgetreten ist, die Funktion selber kann noch unterscheiden zwischen "Datei korrupt" und "anderer Fehler in der Datei").
    Auf der anderen Seite weiß der Aufrufer am besten, wie die Fehler-Information ausgewertet werden kann (in einem Fall brauchst du nur einen Eintrag in einem Logfile, in einem anderen Fall soll gleich eine Meldung für den Nutzer aufploppen.
    -> beide Möglichkeiten haben ihre Daseinsberechtigung.

    (bei unserem Code gibt es mitunter auch eine Zwischenlösung: Die Funktion schreibt die Log-Informationen bzw. Fehlerbeschreibung in einen String-Parameter und der Aufrufer entscheidet dann, was er damit anfangen will)



  • Ich würde eine Exception werfen, die den Fehler genau beschreibt.



  • 314159265358979 schrieb:

    Ich würde eine Exception werfen, die den Fehler genau beschreibt.

    Wenns nur um Fehler-Logging geht würde ich genauso verfahren: Bei Auftreten eines Fehlers die Beschreibung in die zu werfende Exception schreiben, beim endgültigen Fangen der Exception den Text ins Logfile schreiben. Sollte die Exception zwischendurch gefangen und weitergeworfen werden, den Fehlertext um Informationen ergänzen. So kann alles relevante ins Logfile kommen: der Werfer der Exception weiß, was genau schiefgelaufen ist, der Fänger kennt den Kontext und weiß, aus welcher Situation heraus die fehlschalgende Funktion gerufen wurde.


Anmelden zum Antworten