[PHP] ErrorHandler für ausnahmenbasierte Fehlerbehandlung

[PHP] ErrorHandler für ausnahmenbasierte Fehlerbehandlung

Größtenteils wurde der Code aus einem PHP-Doku-Kommentar übernommen. Ich habe lediglich den Teil entfernt, der keinen Sinn macht, da benutzer-definierte Fehlerbehandlungsroutinen nicht für alle Typen von Fehlern benutzt werden kann. Siehe auch http://php.net/manual/de/function.set-error-handler.php

Einfach den Code in ein Script einfügen (bpsw. Errorhandler.php) und dieses dann in den eigenen Code mittels include() oder require() einbinden. Sobald ein E_XXXX-Fehler auftritt (z.B. eine Notice) wird statt dem Fehler im Browser auszugeben eine Exception geworfen, was dem OOP-Gedanken entspricht.

PHP:
<?php
/**
* Errorhandler.php
* @author elad dot yosifon at gmail dot com
* @see http://php.net/manual/de/function.set-error-handler.php#112881
* Provides an exception based error handling
*/
/** Exceptions derived from ErrorException **/
class WarningException  extends ErrorException {}
class NoticeException  extends ErrorException {}
class UserErrorException  extends ErrorException {}
class UserWarningException  extends ErrorException {}
class UserNoticeException  extends ErrorException {}
class StrictException  extends ErrorException {}
class RecoverableErrorException  extends ErrorException {}
class DeprecatedException  extends ErrorException {}
class UserDeprecatedException  extends ErrorException {}
/**
* The error handler
* @param number $err_severity The level or error
* @param string $err_msg The message of the error
* @param string $err_file The file where the error has occured
* @param number $err_line The line where the error has occured
* @param array $err_context Detailed error description
*/
function application_error_handler($err_severity, $err_msg, $err_file, $err_line, array $err_context)
{
   // error was suppressed with the @-operator
   if (0 === error_reporting()) { return false;}
   switch($err_severity)
   {
     case E_WARNING:  throw new WarningException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_NOTICE:  throw new NoticeException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_USER_ERROR:  throw new UserErrorException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_USER_WARNING:  throw new UserWarningException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_USER_NOTICE:  throw new UserNoticeException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_STRICT:  throw new StrictException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_RECOVERABLE_ERROR:  throw new RecoverableErrorException ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_DEPRECATED:  throw new DeprecatedException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     case E_USER_DEPRECATED:  throw new UserDeprecatedException  ($err_msg, 0, $err_severity, $err_file, $err_line);
     default:            throw new ErrorException  ($err_msg, 0, $err_severity, $err_file, $err_line);
   }
}

set_error_handler("application_error_handler", E_ALL | E_STRICT);
Exceptions werden dann regulär über try-catch abgefangen:

PHP:
<?php
require 'Errorhandler.php';

try
{
  echo $_GET['undefinierte_get_variable'];
}
catch(Exception $ex)
{
  printf("%s: %s<pre>%s</pre>", get_class($ex), $ex->getMessage(), $ex->getTraceAsString());
}
NoticeException: Undefined index: undefinierte_get_variable
#0 D:\web\tests\eh-test.php(6): application_error_handler(8, 'Undefined index...', 'D:\\web\\tests\\eh...', 6, Array)
#1 {main}
Autor
saftmeister
Aufrufe
57
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen

More resources from saftmeister