Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 30-Sep-2005
< Voriger Tag   Nächster Tag >

Freitag, 30. September 2005

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.

[Direktlink]

< Voriger Tag   Nächster Tag >

  RSS V0.91

<September 2005 >
   01020304
05060708091011
12131415161718
19202122232425
2627282930  

Home-Produkte-Testarea-Kontakt-Datenschutz-Aktualisiert: 30-Sep-2005
(C) 2000-2018 by Sven Drieling