User Tools

Site Tools


php:functions:errorsasexceptions

[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

<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:

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{}

<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

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());
} 
php/functions/errorsasexceptions.txt · Last modified: 12.02.2014 14:21:22 (external edit)