Ein Beispiel einstellen...

[email protected] ("horseland hispeed") Tue, 18 Sep 2007 15:33:02 +0200
Newsgroups php.doc.license
Message-ID <000301c7f9f8$706ee570$2101a8c0@frediund90935f>
Sehr geehrte Damen und Herren,

ich habe schon einmal versucht Sie wegen eines Eintrages anzufragen. Ich 
schreibe auf meiner Site ein Manual und hätte nun gerne eines Ihrer 
Beispiele übernommen (mit Verweis darauf).
Bei dem Beispiel handelt es sich um die Funktion set_error_handler, 
übernehmen wollte ich den Quelltext in etwas veränderter Form (mehr 
deutsch).

Für Ihre prompte Antwort bedanke ich mich bereits im Voraus und verbleibe

mit freundlichen Grüssen


Dies wäre der komplette Text, den ich einstellen möchte:



--------------------------------------------------------------------------
Allgemeine Beschreibung:<br />&nbsp;<br />
set_error_handler() legt die benannte Funktion als aktuellen Fehlerhandler 
fest. Die Funktion kann beliebig festgelegt werden, üblicherweise gibt sie 
definierte Fehlermeldungen aus und bei einem kritischen Fehler sollten 
zusätzlich "Aufräumarbeiten" durchgeführt werden. <br />
Die Funktion wird mit zwei Parametern aufgerufen: Dem Fehlercode und einem 
String, der den Fehler beschreibt. Es können noch drei zusätzliche Parameter 
angegeben werden; der Name der Datei wo der Fehler auftrat, die Nummer der 
Zeile in der genannten Datei wo der Fehler auftrat und den Kontext in 
welchem der Fehler auftrat. Die Funktion gibt den Namen der 
benutzerdefinierten Funktion aus, oder false wenn irgend ein Fehler beim 
setzen des Handlers auftrat.
<br /> <br />
Anmerkung: Es kann auch ein Array anstatt einer Funktion definiert werden, 
welches eine Referenz auf ein Objekt und einen Methodennamen enthält 
übergibt.
<br />
Die folgenden Typen 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.
<br /> <br />
Untenstehendes Beispiel wurde ausnahmsweise aus dem PHP-Handbuch des 
"PHP-Manuals (Copyright © 1997 - 2005 by the PHP Documentation Group) 
übernommen. Leider haben wir auf unsere Veröffentlichungsanfrage keine 
Reaktion erhalten -d.h. die Mail kam beim Empfänger nicht an.



// 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);


function myErrorHandler($errno, $errstr, $errfile, $errline)
{
  switch ($errno) {
  case FATAL:
    echo "<b>FATALER ERROR</b> [$errno] $errstr<br />\n";
    echo "  Fataler Fehler in Linie $errline in der Datei $errfile";
    echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
    echo "abbrechen...<br />\n";
    exit(1);
    break;
  case ERROR:
    echo "<b>ERROR</b> [$errno] $errstr<br />\n";
    break;
  case WARNING:
    echo "<b>WARNUNG</b> [$errno] $errstr<br />\n";
    break;
  default:
    echo "Unbestimmter error Typ: [$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 ist undefiniert, benutze: scale = 
$scale",
      FATAL);
  }

  if (!is_array($vect)) {
    trigger_error("Inkorrekte Eingabe vector, Feld mit Werten erwartet", 
ERROR);
    return null;
  }

  for ($i=0; $i<count($vect); $i++) {
    if (!is_numeric($vect[$i]))
      trigger_error("Wert an Position $i ist keine Nummer, verwendet 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<br />";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);

// ein zweites Array erzeugen, das Warnungen generiert
echo "----<br />vector b - Warnung (b = log(PI) * a)<br />";
$b = scale_by_log($a, M_PI);
print_r($b);

// hier ist der Grund für das Problem: anstatt einem Array
// wird ein String übergeben
echo "----<br />vector c - Fehler<br />";
$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 "----<br />vector d - fataler Fehler<br />";
$d = scale_by_log($a, -2.5);
----------------------------------------------------------------------