PHP: PEAR::Error nach PEAR::Exception
PHP 5 unterstützt Exceptions zur Fehlerbehandlung. PEAR-Klassen, ohne Exception-Unterstützung, lassen sich leicht per Error-Handler um die Unterstützung für Exceptions erweitern.
Ich bin im Moment dabei mich in Richtung PHP 5 zu orientieren, u.a. weil PHP 5 Exceptions unterstützt. Mit diesen lassen sich der eigentliche Programmcode und die Fehlerbehandlung voneinander trennen. Während man in PHP 4 if-Abfragen für die PEAR::Error-Objekte benötigt:
$data = $fh->read(10);
if(PEAR::isError($data))
{
die("ERROR: " . $data->getMessage() . ' -- ' . $date->getDebugInfo() . "n");
}
Werden diese in PHP 5 nicht mehr gebraucht. Stattdessen gibt es try-catch-Blöcke - die if-Abfragen innerhalb des eigentlichen Programmcodes entfallen:
try
{
$fh = new YD_File_FileHandle('../testData/lines.txt');
while(!$fh->isEOF())
{
echo $fh->read(10);
}
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
if($fh){$fh->close();} // TODO Error
Allerdings gibt es noch nicht viele Klassen, die Exceptions direkt unterstützen. Die Fehlerobjekte (PEAR::Error) der PEAR-Klassen lassen sich jedoch leicht in Exception umwandeln.
Früher war dazu mal PEAR_ERROR_EXCEPTION vorgesehen, das
ist inzwischen aber überholt. Stattdessen wird die Benutzung eines
eigenen PEAR-Error-Handlers empfohlen der PEAR::Exceptions
erzeugt. Ich benutze dazu folgende Zeilen, die per require_once() in PHP 5-Programmen eingebunden werden.
<?php
require_once 'PEAR.php';
require_once 'PEAR/Exception.php';
// PEAR error handler to convert PEAR::Error to
// PEAR::Exception.
//
// Usage: require_once 'YD/PEAR/ErrorToExceptionHandler.php';
function YD_PEAR_ErrorToExceptionHandler($error)
{
// Throw exception
if($error->getCode())
{
throw new PEAR_Exception($error->getMessage() .
' -- Debug: ' .
$error->getDebugInfo(),
$error->getCode());
}
else
{
throw new PEAR_Exception($error->getMessage() .
' -- Debug: ' .
$error->getDebugInfo());
}
}// YD_PEAR_ErrorToExceptionHandler
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK,
'YD_PEAR_ErrorToExceptionHandler');
?>
$error->getDebugInfo() ist u.a. enthalten, weil einige PEAR-Klassen darin den Dateinamen und die Zeilennummer weitergeben, in der der Fehler so ungefähr aufgetreten ist - das erleichtert die Fehlersuche. Bei einem Produktivserver sollte man darauf achten, dass solche Informationen nicht auf dem Bildschirm erscheinen, z.B. durch eine passende Konfiguration.
