Fehler Benutzerdefiniert abfangen

PHP  (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.

Quellcode (ausblenden | aufklappen)

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
<?php
 
   /**
    * 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']);
         }
      }
 
 
   }
 
?>