======[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 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;
}
?>
Ergibt:
14
Warning: Division by zero in C:\xampp\htdocs\test\test3.php on line 27
Wie man sieht, hat man keine Ahnung durch welchen Aufruf der Fehler entstand. ==== Mit Error-Handler ohne try{} ====
 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 machen try{ //TODO dein Code } catch(Exception $e){ echo "".$e->getMessage()."
\n"; echo nl2br($e->getTraceAsString()); }
Und man kann so auch mit Exceptions arbeiten 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()."
\n"; echo nl2br($e->getTraceAsString()); }
{{tag>PHP Function Exception}}