php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
fatal error mit selbst definiertem error_hanlder abfangen


 
php_rookie
11-02-2007, 16:18 
 
hi,

folgendes script:
<?php
error_reporting(E_ALL | E_STRICT);

class Test {
public function __construct() {
set_error_handler(array($this, 'error_handler'));
trigger_error("yx");
}

public function error_handler($code, $message, $file, $line) {
echo "$code: $message @ $file, $line";
}
}

$test = new Test();
$test->callNotDefinedFunction();
?>
der getriggerte error in zeile 7 wird anstandslos vom selbst definierten error_handler übernommen, der aufruf der nicht definierten funktion in zeile 16, welcher einen fatal error erzeugt, jedoch nicht.

woran liegt das und wie kann man ALLE fehler von einem selbst definierten error_handler abfangen lassen?

TIA

 
asp2php
11-02-2007, 16:37 
 
schon mal an try und catch gedacht? woher soll der Parser wissen, dass er deine Klasse nehmen soll?

 
3DMax
11-02-2007, 20:40 
 
public function __call($method, $a)
{
trigger_error('Method: "'.$method.'" not exists');
}


wobei exceptions wohl angebrachter wären

 
php_rookie
11-02-2007, 21:47 
 
schon mal an try und catch gedacht?ja. wobei try/catch unvorhergesehene ereignisse abfangen soll, nicht programmierfehler ausbessern... der hintergrundgedanke bei obiger funktion ist es, einem user nicht mit unnötigen details zu verwirren bzw. unnötige details über den webserver preiszugeben. ich möchte prinzipiell ALLE fehler unterdrücken und in ein log-file umleiten. wenn der error_handler in obiger form aktiv ist, werden z.b. fatal-errors (wie der aufruf einer nicht existierenden funktion im beispiel oben) einfach nicht mehr angezeigt, was wohl kaum im sinne des erfinders ist.

der error-handler soll schlussendlich in einem framework mit autoload-funktion eingesetzt werden.woher soll der Parser wissen, dass er deine Klasse nehmen soll?anhand der set_error_handler einstellung möchte man annehmen. nur wird der anscheinend erst beim ausführen aktiv, nicht schon beim parsen der datei...wobei exceptions wohl angebrachter wärengetriggert wird nichts. das war nur ein beispiel um zu demonstrieren, dass der error_handler in der form (fast) funktioniert. tut er aber eben nur fast. deswegen nochmals meine frage: wie kann man ALLE fehler der typen E_ALL | E_STRICT mit einem eigenen error_handler abfangen und behandeln? oder bleibt nur der von dir beschriebene workaround?


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:38 Uhr.