Forum und email

set_error_handler

(PHP 4 >= 4.0.1, PHP 5)

set_error_handler — Bestimmt eine benutzerdefinierte Funktion zur Fehlerbehandlung.

Beschreibung

string set_error_handler ( callback $error_handler )

Setzt eine benutzerdefinierte Funktion (error_handler ) um Fehler in einem Skript zu bearbeiten. Die Funktion gibt die zuvor benutzte Fehlerbehandlungsroutine (falls eine definiert wurde) zurück oder FALSE, falls ein Fehler auftrat. Mit dieser Funktion können Sie Ihre eigene Behandlung von Laufzeitfehlern definieren, beispielsweise in Anwendungen, die bei einem kritischen Fehler die Löschung von Daten bzw. Dateien erfordert oder wenn es nötig ist, unter bestimmten Bedingungen (mit der Funktion trigger_error()) eine Fehlermeldung zu generieren.

Die benutzerdefinierte Funktion erwartet notwendig zwei Parameter: den Fehlercode und eine Beschreibung des Fehlers als String. Ab PHP 4.0.2 sind zudem drei optionale Parameter verfügbar: der Name der Datei, in der der Fehler auftrat, die Nummer der Zeile, in der der Fehler auftrat und der Kontext, in welchem der Fehler auftrat (ein Array, das auf den Punkt in der aktiven Symboltabelle verweist, wo der Fehler auftrat).

Hinweis: Anstelle eines Funktionsnamens kann auch ein Array, das eine Referenz auf ein Objekt und einen Methodennamen enthält, übergeben werden. (Seit PHP 4.3.0)

Hinweis: Die folgenden Fehlertypen können nicht von einer benutzerdefinierten Funktion behandelt werden: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR und E_COMPILE_WARNING.

Das untenstehende Beispiel zeigt die Behandlung von internen Ausnahmen, indem eine Fehlermeldung und die Behandlung des Fehlers durch eine benutzerdefinierte Funktion ausgelöst wird:

Example#1 Fehlerbehandlung mit set_error_handler() und trigger_error()

<?php

// umdefinieren der Konstanten - nur in PHP 4
define("FATAL"E_USER_ERROR);
define("ERROR"E_USER_WARNING);
define("WARNING"E_USER_NOTICE);

// die Stufe für dieses Skript einstellen
error_reporting(FATAL ERROR WARNING);

// Fehlerbehandlungsfunktion
function myErrorHandler($errno$errstr$errfile$errline
{
  switch (
$errno) {
  case 
FATAL:
    echo 
"<b>FATAL</b> [$errno] $errstr<br />\n";
    echo 
"  Fatal error in line $errline of file $errfile";
    echo 
", PHP " PHP_VERSION " (" PHP_OS ")<br />\n";
    echo 
"Aborting...<br />\n";
    exit(
1);
    break;
  case 
ERROR:
    echo 
"<b>ERROR</b> [$errno] $errstr<br />\n";
    break;
  case 
WARNING:
    echo 
"<b>WARNING</b> [$errno] $errstr<br />\n";
    break;
  default:
    echo 
"Unkown error type: [$errno] $errstr<br />\n";
    break;
  }
}

// Funktion zum Test der Fehlerbehandlung
function scale_by_log($vect$scale
{
  if (!
is_numeric($scale) || $scale <= 0) {
    
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale",
      
FATAL);
  }

  if (!
is_array($vect)) {
    
trigger_error("Incorrect input vector, array of values expected"ERROR);
    return 
null;
  }

  for (
$i=0$i<count($vect); $i++) {
    if (!
is_numeric($vect[$i]))
      
trigger_error("Value at position $i is not a number, using 0 (zero)"
        
WARNING);
    
$temp[$i] = log($scale) * $vect[$i];
  }
  return 
$temp;
}

// auf die benutzerdefinierte Fehlerbehandlung umstellen
$old_error_handler set_error_handler("myErrorHandler");

// einige Fehler auslösen, zuerst wird ein gemischtes Array
// definiert mit einem nichtnummerischen Eintrag
echo "vector a\n";
$a = array(23"foo"5.543.321.11);
print_r($a);

// ein zweites Array erzeugen, das Warnungen generiert
echo "----\nvector b - a warning (b = log(PI) * a)\n";
$b scale_by_log($aM_PI);
print_r($b);

// hier ist der Grund für das Problem: anstatt einem Array
// wird ein String übergeben
echo "----\nvector c - an error\n";
$c scale_by_log("not array"2.3);
var_dump($c);

// dies ist ein kritischer Fehler, der log() ist für null 
// oder negative Werte nicht definiert
echo "----\nvector d - fatal error\n";
$d scale_by_log($a, -2.5);

?>

Wenn Sie dieses Skript ausführen, erhalten Sie die folgende Ausgabe:

vector a
Array
(
    [0] => 2
    [1] => 3
    [2] => foo
    [3] => 5.5
    [4] => 43.3
    [5] => 21.11
)
----
vector b - a warning (b = log(PI) * a)
<b>WARNING</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
vector c - an error
<b>ERROR</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>FATAL</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
  Fatal error in line 36 of file trigger_error.php, PHP 4.0.2 (Linux)<br />
Aborting...<br />

Es ist wichtig und darf nicht vergessen werden, dass die standardmässige PHP Fehlerbehandlung vollkommen umgangen wurde. Die Einstellungen der Funktion error_reporting() haben keine Auswirkung und Ihre eigene Fehlerbehandlungsroutine wird ohne Rücksicht darauf aufgerufen. Sie können jedoch immer noch den aktuellen Wert von error_reporting lesen und entsprechend handeln. Von besonderer Bedeutung ist, dass dieser Wert 0 sein wird, falls der Befehl, der den Fehler verurscht hat, mit dem @ error-control operator versehen ist.

Beachten Sie auch, dass Sie die() aufrufen können, wenn es notwendig ist. Wenn die Fehlerbehandlungsfunktion zurückkehrt, wird die Ausführung des Skripts beim nächsten Befehl nach dem fehlerverursachenden Befehl fortgesetzt.

Hinweis: Falls Fehler auftreten, bevor das Skript ausgeführt wird (z. B. bei Dateiuploads), kann eine benutzerdefinierte Fehlerbehandlung nicht aufgerufen werden, weil sie zu diesem Zeitpunkt noch nicht registriert ist.

Siehe auch error_reporting(), restore_error_handler(), trigger_error(), und error level constants.