Andreas: Probleme mit Error-Handling

Hallo!

ich habe mal von
http://www.php.net/manual/de/function.set-error-handler.php  folgendes entwas abgewandeltes Script versucht:

<?php

// redefine the user error constants - PHP4 only
define(FATAL,E_USER_ERROR);
define(ERROR,E_USER_WARNING);
define(WARNING,E_USER_NOTICE);

// set the error reporting level for this script
error_reporting(FATAL + ERROR + WARNING);

// error handler function
function myErrorHandler ($errno, $errstr) {
    switch ($errno) {
    case FATAL:
        echo "<b>FATAL</b> [$errno] $errstr<br>\n";
        echo "  Fatal error in line ".__LINE__." of file ".__FILE__;
        echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>\n";
        echo "Aborting...<br>\n";
        exit -1;
        break;
    case ERROR:
        echo "<b>ERROR</b> [$errno] $errstr<br>\n";
        break;
    case WARNING:
        echo "<b>WARNING</b> [$errno] $errstr<br>\n";
        break;
    default:
        echo "Unkown error type: [$errno] $errstr<br>\n";
     echo "error in line ".__LINE__." of file ".__FILE__;
        break;
    }
}

// set to the user defined error handler
$old_error_handler = set_error_handler("myErrorHandler");

$a = 1;
$b = 0;

$x = $a / $b;

echo $x;

?>

Als Meldung bekomme ich dann

Unkown error type: [2] Division by zero
error in line 30 of file /webseite/errors.php

Die Fehler-Beschreibung ist richtig, der Dateipfad auch, aber __LINE__ ergibt genau die Zeile in der eben __LINE__ steht und nicht die des Fehlers. Wie kann ich an diese Zeile kommen? Oder habe ich was wichtiges in dem Beispielscript auf php.net übersehen?

Viele Grüße
Andreas

PS: Was ist der Unterschied zwischen Handler und Trigger?

  1. Halihallo Andreas

    Als Meldung bekomme ich dann

    Unkown error type: [2] Division by zero
    error in line 30 of file /webseite/errors.php

    Die Fehler-Beschreibung ist richtig, der Dateipfad auch, aber __LINE__ ergibt genau die Zeile in der eben __LINE__ steht und nicht die des Fehlers. Wie kann ich an diese Zeile kommen? Oder habe ich was wichtiges in dem Beispielscript auf php.net übersehen?

    Hm. Einen Unterschied zu dem Beispielscript sehe ich keinen. Aber du kannst mal folgendes versuchen:

    function error ($errno, $errstr, $errfile, $errline, $errcontext)

    vielleicht enthalten dann $errline die "wirkliche" Fehlerverursachende Zeile. Und __LINE__ ist einfach wirklich nur die aktuelle (macht ja eigentlich Sinn). Ich glaube der Errorhandler gibt noch weitere Parameter, s. oben.

    Viele unsichere und ungetestete Grüsse

    Philipp

    1. Hi!

      Aber auch im, original wird das bei "FATAL Error" so gemacht. Aber hast Recht, hätte mal die Kommentare lesen sollen, direkt im ersten stands ;-)

      OK, soweit so gut. JEtzt habe ich das nächste Problem, und zwar, wie kann ich einen Array genauso im Email-Text ausgeben, wie mit print_r($array) ?

      Gibts ne einfach Möglichkeit diese Ausgabe in eienn String umzuleiten?

      Ich weiß, man könnte das in einer Schleife machen... aber geht das nicht direkt?

      Viele Grüße
      Andreas

      1. Halihallo Andreas

        Aber auch im, original wird das bei "FATAL Error" so gemacht. Aber hast Recht, hätte mal die Kommentare lesen sollen, direkt im ersten stands ;-)

        Ja, daher :-)
        Aber hat's denn so funktioniert? - Findest du mit den Parametern die "ursprüngliche" Zeile heraus?

        OK, soweit so gut. JEtzt habe ich das nächste Problem, und zwar, wie kann ich einen Array genauso im Email-Text ausgeben, wie mit print_r($array) ?

        Nanu??? - Liest du nichteinmal mehr deine Lieblings-Doku??? - Man sollte halt die Dokus in ursprünglicher Notation lesen, nicht die deutschen Versionen, dort steht nämlich:

        "Tip: As with anything that outputs its result directly to the browser, you can use the output-control functions to capture the output of this function, and save it - for example - in a string."

        damit solltest du die Ausgabe der Funktion in einen String umleiten können, den du ganz einfach in's E-Mail einplanzen kannst.

        Gibts ne einfach Möglichkeit diese Ausgabe in eienn String umzuleiten?

        http://www.php.net/manual/de/ref.outcontrol.php

        Ich weiß, man könnte das in einer Schleife machen... aber geht das nicht direkt?

        s. oben :-)

        Viele Grüsse

        Philipp

        1. Halihallo Andreas

          Aber auch im, original wird das bei "FATAL Error" so gemacht. Aber hast Recht, hätte mal die Kommentare lesen sollen, direkt im ersten stands ;-)

          Ja, daher :-)
          Aber hat's denn so funktioniert? - Findest du mit den Parametern die "ursprüngliche" Zeile heraus?

          jep! als $context habe ich sogar einen Array mit allen Umgebungsvariablen!!!

          http://www.php.net/manual/de/ref.outcontrol.php

          na, das kenne ich wohl, hab es auch schon mehrmals verwendet(Forum highlighting, PDF-Generierung...), aber ich dacht es geht auch einfacher ;-)

          eine Version habe ich noch gefunden, mit var_dump(), nur ist die Ausgabe sehr viel unschöner als die von print_r()

          Ich dachte ich hätte die Lösung: var_export() http://www.php.net/manual/de/function.var-export.php, aber irgendwie gibt mir das gar nichts aus.

          Grüße
          Andreas

          1. Halihallo Andreas

            Aber auch im, original wird das bei "FATAL Error" so gemacht. Aber hast Recht, hätte mal die Kommentare lesen sollen, direkt im ersten stands ;-)

            http://www.php.net/manual/de/ref.outcontrol.php

            na, das kenne ich wohl, hab es auch schon mehrmals verwendet(Forum highlighting, PDF-Generierung...), aber ich dacht es geht auch einfacher ;-)

            War nur ein kleiner Reminder :-)
            Ja, versteh ich, dass du es lieber einfacher hättest (ginge mir net anders). Wäre schon, wenn man den Output einfach in die Variable einlesen kann. Aber sowas geht glaub ich nur mit var_export oder -dump, aber was erzähl ich hier, du bist der php-Experte...

            eine Version habe ich noch gefunden, mit var_dump(), nur ist die Ausgabe sehr viel unschöner als die von print_r()

            Ich dachte ich hätte die Lösung: var_export() http://www.php.net/manual/de/function.var-export.php, aber irgendwie gibt mir das gar nichts aus.

            Hm. Du meinst, es gibt dir nix in die Variable, oder gibt's sogar gar nix aus (im Sinne von Ausgabe an den Client über STDOUT)? - Vielleicht geht's mit diesem zweiten Parameter, der TRUE ist?

            "You can also return the variable representation by using TRUE as second parameter to this function."

            Keine Ahnung, ob das das ist, wonach du suchst...

            Viele Grüsse

            Philipp

        2. Hi Philipp!

          Ich fasse es nicht! Ich habe jetzt bestimmt 2-3 Stunden probiert das hinzubekommen, vor allem mit var-export() - das tolle - das funktioniert erst ab 4.2, und ich habe halt 4.1.2 ;-))))))
          Und da ich damit auch noch innerhalb meiner Error-Handling Funktion herumexperimentiert hatte habe ich das auch nicht gemerkt ;-)
          Naja, jetzt weiß ich wieder mehr, und wie man schneller Fehler findet ;-)
          Also bleibt mir nur das ganze über Ausgabesteuerung zu machen, ist ja auch nicht wirklich kompliziert, aber Du weißt wie ich sowas sehe...

          Aber Danke für Deine Hilfe!

          Grüße
          Andreas