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.