Errors als Exceptions behandeln
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");
<pre> <?php echo f1(13, 1); //Fehler generieren -> 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; } ?> </pre>
Ergibt:
14Wie man sieht, hat man keine Ahnung durch welchen Aufruf der Fehler entstand.
Warning: Division by zero in C:\xampp\htdocs\test\test3.php on line 27
<pre> <?php //Fehlerhandler definieren function exceptionErrorHandler($errno, $errstr, $errfile, $errline ) { if($errno & ini_get('error_reporting')) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } } //Fehlerhandler einbinden set_error_handler("exceptionErrorHandler"); //Funktionsaufruf ohne Fehler echo f1(13, 1); //Fehler generieren -> 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; } ?> </pre>
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 kann man nun ein sauberes Exception-Handling machen
try{ //TODO dein Code } catch(Exception $e){ echo "<b>".$e->getMessage()."</b><br />\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 "<b>".$e->getMessage()."</b><br />\n"; echo nl2br($e->getTraceAsString()); }