(30.05.2010 23:53)
In meinem neusten Projekt stand ich vor dem Problem, dass eine Klasse alle Fehler wie E_ERROR und E_WARNING abfangen sollte.
Dies kann man mit den Funktionen register_shutdown_function() und error_get_last() realisieren. Man definiert einfach eine Funktion die bei dem Beenden
des Scriptes aufgerufen wird. Nun prüft man innerhalb dieser Funktion ab, ob ein Fehler während der Ausführung aufgetreten ist.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/** * SimCMS - Multiwebsite Content Management * * LICENSE * This work is licensed under a * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License * * @copyright Copyright (c) 2010 Christian Blechert (www.blechert.name) * @license http://creativecommons.org/licenses/by-nc-sa/3.0/ * @author Christian Blechert (christian@blechert.name) * @version 1.0.0 */ /** * Ersetzt den Standard-Errorhandler von PHP durch einen eigenen. * Bei einem PHP Fehler wird der Prozessorcache geleert und eine angepasste * Fehlermeldung ausgegeben * * EINBINDUNG: * set_error_handler(array("Custom_Error_Handler", "handle_error")); * register_shutdown_function(array("Custom_Error_Handler", "customShutdownHandler")); */ class Custom_Error_Handler { /** * Bei einem Fehler Scriptausfuehrung beenden? * @var bool */ static private $abort_errors = true; /** * Bei einem Fehler Scriptausfuehrung beenden? * @param bool $b */ static public function die_on_error($b) { self::$abort_errors = ($b===true ? true : false); } /** * Einen Fehler behandeln - wird von set_error_handler() verwendet * @param int $code Fehlercode * @param string $msg Fehlermeldung * @param string $file Datei * @param int $line Zeile * @return bool */ static public function handle_error($code, $msg, $file, $line) { if(ini_get('error_reporting')!="0" && ini_get('display_errors')!="0") { @ob_end_clean(); echo "<h1>PHP Error occurred</h1>"; echo "<p>"; switch ($code) { case E_ERROR: case E_USER_ERROR: echo "<b>Error: </b>"; break; case E_WARNING: case E_USER_WARNING: echo "<b>Warning: </b>"; break; case E_NOTICE: case E_USER_NOTICE: echo "<b>Notice: </b>"; break; default: echo "<b>Unknown Error (".$code."): </b>"; break; } echo $msg; echo "</p>"; echo "<p>"; echo "<b>File: </b>".$file.":".$line; echo "</p>"; if(self::$abort_errors===true) { exit(1); } } return true; } /** * Wird von register_shutdown_function() verwendet um auch E_ERROR * abfangen zu koennen */ static public function customShutdownHandler() { $error_codes = array(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 30719); $last_error = error_get_last(); if(in_array($last_error['type'], $error_codes)) { self::handle_error($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); } } } |