======[PHP] exceptionErrorHandler======
Errors als Exceptions behandeln
===== Funktion =====
Mit der folgenden Funktion kann aus Errors Exceptions generiert werden
/**
* Fehlerbehandlung sauber definieren. Alle Errors als Exception ausgeben
* @param $errno
* @param $errstr
* @param $errfile
* @param $errline
*/
function exceptionErrorHandler($errno, $errstr, $errfile, $errline ) {
if($errno & ini_get('error_reporting')) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
}
set_error_handler("exceptionErrorHandler");
===== Anwendungsbeispiele =====
==== Herkömliche Fehlerbehandlung ====
Ergibt:
Ergibt in f2() division durch 0
echo f1(3,0);
function f1($v1, $v2){
$v = $v1 + $v2;
return f2($v, $v2);
}
function f2($v1, $v2){
return $v1/$v2;
}
?>
14Wie man sieht, hat man keine Ahnung durch welchen Aufruf der Fehler entstand. ==== Mit Error-Handler ohne try{} ====
Warning: Division by zero in C:\xampp\htdocs\test\test3.php on line 27
Ergibt in f2() division durch 0
echo f1(3,0);
function f1($v1, $v2){
$v = $v1 + $v2;
return f2($v, $v2);
}
function f2($v1, $v2){
return $v1/$v2;
}
?>
Wenn wir den Error_handler mit ''set_error_handler()'' setzen, sieht dann die Fehlermeldung so aus
14
Fatal error: Uncaught exception 'ErrorException' with message 'Division by zero' in C:\xampp\htdocs\test\test3.php:23 Stack trace: #0 C:\xampp\htdocs\test\test3.php(23): exceptionErrorHandler(2, 'Division by zer...', 'C:\xampp\htdocs...', 23, Array) #1 C:\xampp\htdocs\test\test3.php(19): f2(3, 0) #2 C:\xampp\htdocs\test\test3.php(15): f1(3, 0) #3 {main} thrown in C:\xampp\htdocs\test\test3.php on line 23
Damit lassen sich Probleme wirklich besser finden ==== Mit try...catch ==== Mit try...catch kann man nun ein sauberes Exception-Handling machentry{ //TODO dein Code } catch(Exception $e){ echo "".$e->getMessage()."
Und man kann so auch mit Exceptions arbeiten
\n"; echo nl2br($e->getTraceAsString()); }try{ //TODO viel Code $myObect = new MyClass(); try{ $myObejct->start(); $value = $myObejct->value; }catch(Exception $e){ // $myObejct->value wirft eine Fehler. In diesem Fall setzen wir $value auf -1 $value = -1; } //TODO restlicher Code } catch(Exception $e){ echo "".$e->getMessage()."
{{tag>PHP Function Exception}}
\n"; echo nl2br($e->getTraceAsString()); }