Error handling

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Error handling

    Hallo,

    hab mal ne grundlegende Frage wie ihr Fehler behandelt und welche Möglichkeit ihr am elegantesten findet.

    Dabei muss man klar unterscheiden zwischen:

    1. Den Fehler abfangen (eigener Errorhandler?, welche Fehler sind typisch und Wert abgefangen zu werden?)

    2. Auf den Fehler reagieren (aufwendige Abfangmechanismen?)

    3. Eine Fehlermeldung ausgeben(nur errormeldung des php moduls? eigener text?, ins design eingebaut?)

    Mir kommts vorallem auf folgende Kriterien an: im Code übersichtlich und elegant, leicht (nachträglich) einzufügen und schön für den Besucher der Ausgabeseite

    Gruß
    Thomas

  • #2
    ich mache das immer so das ich im script halt ganz normal werte prüfe und ggf meinem Error-Array die Fehlermeldungen zuweise

    also zb if ($pwindb != $pweingabe) { $error[] = "Falsches PW"; }

    so im groben.

    Dann spar ich mir oft verschachtelte If abfragen und Frage am Ende einfach nur ab ob $error leer ist und wenn nicht rufe ich eine funktion auf die $error an die template engine übergibt und dort werden dann alle Fehlermeldungen ausgegeben.

    Kommentar


    • #3
      Re: Error handling

      Erst mal unterscheiden zwischen Fehlerarten:

      - fachliche/aus den Eingabedaten herrührende Fehler -> Plausibilitätsprüfung und ggf. Meldung

      - technische Fehler (wie Datei lesen/schreiben schlug fehl, Verbindung zur DB nicht verfügbar) -> gehört abgefangen, neutrale Meldung an den Benutzer

      - Scriptfehler -> sollten 1. produktiv überhaupt nicht mehr auftauchen, und 2. wenn doch, geht den Benutzer die originale Fehlermeldung von PHP überhaupt nichts an (könnte sogar zum Risikio werden, wenn der Benutzer diese zu sehen bekommt)
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Danke euch beiden, hat mir schonmal weitergeholfen. Werde noch bischen weiterentwickeln und dann hier vorstellen.

        Gruß
        tn249

        Kommentar


        • #5
          Re: Re: Error handling

          - Scriptfehler -> sollten 1. produktiv überhaupt nicht mehr auftauchen, und 2. wenn doch, geht den Benutzer die originale Fehlermeldung von PHP überhaupt nichts an (könnte sogar zum Risikio werden, wenn der Benutzer diese zu sehen bekommt)
          Leider passiert das z.B viel zu oft... Selbst auf den GANZ grossen seiten wird viel zu viel über die Beschaffenheit des Servers preisgegeben.

          Wenn schon Fehlermeldungen dann sollte man wie wahsaga schon sagte klar unterscheiden was den User angeht und was nicht.

          So sachen wie (auch schon gesehen, traurig aber wahr)

          Die Benutzerdaten USER: dbuser PASS: dbpass sind falsch

          Kann datei /srv/htdocs/user123/config/mysql.inc nicht finden
          (GROSSES SICHERHEITSRISIKO)

          sind ja wohl absolut nicht für den Surfenden gedacht.
          Dann eher eine Mail anden Admin wenn da etwas Sicherheitsrelevantes nicht i.O ist.

          Was fertiges, welches Sicherheitslücken bedenkt ist mir bisher nicht untergekommen..

          Kaguya baut sich ein Error Array, das mache ich auch.
          Aber ich gebe nicht alles zum Surfer aus.

          PHP-Code:
          $error[] = array("Admin" => "PW Falsch $eingabe"); 
          Am ende des Scripts wird entschieden was wohin soll.
          gruss Chris

          [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

          Kommentar


          • #6
            PHP-Code:
            if(DEV_MODE==true){ 
                
            ini_set("error_reporting",E_ALL);  // Aktiviert alle Error Meldungen
            } else {
                
            ini_set("error_reporting",E_ALL); // Aktiviert alle Error Meldungen
                
            ini_set("display_errors",0); // Unterdrückt die Error Meldungen
                
            ini_set("log_errors",1); // Aktiviert Logging
                
            ini_set("error_log",$cfg['global']['error_log']);    // Gibt Pfad zum LOG-File an

            Davor definier ich die Konstante DEV_MODE, so werden alle Fehler nur im Entiwcklungsmodus angezeigt, im produktiven werden alle geloggt.

            Was haltet ihr davon?

            Kommentar


            • #7
              stimmt schon. in der entwicklung muss man E_ALL oder gar E_STRICT nutzen - da kann es nicht zu viel information geben.

              ansonsten hat wahsaga schon recht - die fehler, deren erscheinung nicht von der qualität der anwendung abhängt (z.b. datenbank unerreichbar, irgendeine datei nicht da, wo sie sein soll, etc.) müssen ausführlich geloggt werden, dem benutzer jedoch nur ein "service derzeit nicht erreichbar" o.ä. ausspucken.

              Kommentar


              • #8
                das mit dem loggen sollte ich auch mal einbauen, dann sieht der user also garnichts wenn die db nicht gefunden wurde oder ähnliches ?

                das mit dem fehlerarray mache ich nur bei plausiprüfungen, also ob alle Eingaben korrekt sind oder wenn kein Datensatz gefunden wurde, das sind aber alles Fehlermeldungen wo der User nicht sehen kann...

                wenn allerdings dateien oä nicht gefunden werden mache ich das nochimmer mit die (); was wohl nicht so toll ist.
                also wenn ich das logging aktiviert habe würde die() nichts mehr zum browser schicken ?

                Kommentar


                • #9
                  Schön find ich das die() auch nicht, aber ist halt das leichteste (am wenigsten umständliche).

                  Du könntest dir z.B. ne Funktion schreiben die du einfach vor dem die() aufrufst. z.B.: logError($bereich, $zeit, $fehlermeldung);

                  Kommentar


                  • #10
                    Mal kurz als Beispiel meine Fehlerausgabe, hab leider gerade wenig Zeit. Müsste aber ganz gut zu verstehen sein. Ich nehme die Funktion für alle Fehlerarten, in meinen SQL-Anfragen, Template- /Formular-/Dateiüberprüfungen.

                    $msg: Fehlermeldung (wird auch bei Aufruf als Variable übergeben, aus Array)
                    $backbutton: Unter der Fehlermeldung erscheint der Text "zurücK" (verlinkt)
                    $showmail: Webmastermailadresse wird angezeigt
                    $errormode: Auswahl für Haupt-Template (z.B. 0 für "normale Website", 1 für Adminbereich, usw)
                    $dontquit: Normal wird das Script bei Fehler beendet (z.B. mysql-Fehler). Für falsche Eingaben im Formular z.B. auf 1 gesetzt, Script läuft also weiter.

                    In der Funktion greife ich auf write_log() zu, eigene Funktion zum Logfile schreiben. Ist ganz sinnvoll: "Welche Fehler tauchen bei anderen auf?" Kann man gut Schwachstellen in Scripten finden.

                    PHP-Code:


                    function diesmiling($msg$backbutton=1$showmail=0$errormode=0$dontquit=0)
                    {
                      global 
                    $var_path;
                      require(
                    $var_path['config']."config.inc.php");
                      if(!
                    $msg)
                      {
                        
                    $msg $var_error['standard'];
                      }
                      
                    $userid $_SESSION['userid'];
                      if(
                    $userid==""$userid 0;
                      
                    write_log("errorlogfile"$userid$msg);
                      
                    $body $msg;
                      if(
                    $showmail==1$body .= $var_error['error']; // Standardtext mit Mailadresse des Webmasters
                      
                    if($errormode==0$template_site $var_template['site'];
                      if(
                    $errormode==1$template_site $var_template['cms_admin_site'];
                      if(
                    $backbutton==1$body .= "<br><br><a href=\"javascript:history.back()\">zur&uuml;ck</a>";
                      
                    $title "Fehler";
                      
                    $error = new template();
                      if(!
                    $error)
                      {
                        echo 
                    "Fehler beim Anzeigen einer Fehlermeldung!"// nuja, man weiß ja nie ....
                      
                    }
                      else
                      {
                        
                    $error->add_template(array(error=>$var_template['error'],
                                                   
                    site=>$template_site));
                        foreach(
                    $token as $key => $elem)
                        {
                          
                    $error->add_value($key, $$elem);
                        }
                        
                    $error->add_value(cms_header"Fehler!");
                        
                    $error->format($include_start$include_end);
                        
                    $error->parse(bodyerror);
                        
                    $error->parse(OUTPUTsite);
                        
                    $error->print_template();
                      }
                      if(
                    $dontquit == 0) die;

                    Hoffe ich konnte gute Vorschläge machen

                    Kommentar

                    Lädt...
                    X