PHP5: Keine Ausnahmen bei den Exceptions

PHP gehört zu Sprachen, die einen unglaublich schlechten Ruf genießen. Dieser Ruf gründet sich hauptsächlich auf die teilweise sehr pragmatisch implementierten Konzepte in Version 4 der Sprache. PHP 5 war für alle die eine größere Codebasis pflegen ein echter Sprung nach vorne. Und jetzt, fünf Jahre nach Veröffentlich von PHP 5, haben selbst die faulsten konservativsten Systemadministratoren Updates installiert und man kann als Hacker endlich davon bei der täglichen Arbeit profitieren. Zum Beispiel, bei der Fehlerbehandlung.
Das Problem ist so alt wie die Programmierung: Was mache ich mit Fehlern? Also keinen logischen Fehlern, sondern nicht vorhersagbare Seiteneffekte Fehler die entstehen, weil eine Datei nicht schreibbar ist, ein Server nicht erreichbar oder weil der Drucker schlicht lichterloh in Flammen steht?

Jeder der ernsthaft in PHP programmiert, weiß, dass die eingebaute Fehlerbehandlung eher suboptimal umgesetzt sind. Der Errorhandler spuckt zwar artig Meldungen aus, jedoch greift nicht die beste Neuerung in PHP 5: Exceptions. Bei Builtin-Funktionen auf Rückgabewerte abzufragen funktioniert, jedoch setzt das eine ziemlich große Disziplin bei den Entwicklern voraus. Schön ist anders. Bei selbst geschriebenem Code kann man auf Exceptions setzen, doch dann muss man stets zwei Fehlerkonzepte in seiner Architektur vereinen.
Daher hier ein wenig Code, mit dem man die Fehlerbehandlung von Built-In-Funktionen durch Exceptions spiegeln kann. Dazu wird ein eigener Fehlerhandler installiert, der jede auftretende Fehlermeldung in eine Exception umwandelt. Zwar alles mehr eine Skizze, aber man versteht das Prinzip.

Beispiel:

FaultHandler::install();
try {
    // Wirft eine Exception
    eregi ();
} catch (Exception $e) {
    //  Insert additional magic:
    //  HTTP-Status-Code, JSON convert, Error-Logging ...
    print $e;
}
FaultHandler::uninstall ();

Hier die Implementierung:

class FaultException extends Exception {

     public function __construct($msg, $code, $file, $line) {
          parent::__construct($msg, $code);
          $this->file = $file;
          $this->line = $line;
          //     get a well rendered stack trace
          $this->trace = FaultException::getStackTrace ();
     }     //     end method __construct

     function __toString () {
          return ("".parent::__toString ()."\n\n".$this->trace."");
     }     //     end method __toString

     function getStackTrace () {
          $NL = "\n";
          $dbgTrace = debug_backtrace();
          $dbgMsg .= "Debug backtrace:".$NL;
          $dbgTrace = array_reverse ($dbgTrace);
          for ($i = 0; $i < count ($dbgTrace) - 3; $i++) {
              $dbgInfo = $dbgTrace[$i];
             $dbgMsg .= "#".($i).": "
                       .$dbgInfo['file']." (line ".$dbgInfo['line'].")"
                       ."-> "
                       .$dbgInfo['function']." "
                       ."(".join (", ",$dbgInfo['args']).")".$NL;
          }
          return $dbgMsg;
     }     //     end method getStackTrace

}     //     end class FaultException

abstract class FaultHandler {

     public static function install () {
          set_error_handler (array ("FaultHandler", "handleError"));
     }     //     end method install

     public static function uninstall () {
          restore_error_handler();
     }     //     end method uninstall

     public static function handleError ($no, $str, $file, $line) {
          throw new FaultException ($str, $no, $file, $line);
     }     //     end method handleError

}     //     end class FaultHandler

Ausbaumöglichkeiten gibt es viele: Innerhalb einer JSON-Schnittstelle könnte man sich seine Fehlermeldungen als schöne Exception-Nachrichten schicken lassen oder Logging einbauen oder oder oder.

Vielleicht finde ich ja mal Zeit, mehr als nur eine Skizze zu schreiben. Stay tuned.

Speichern, anderen zeigen, genießen:
  • Digg
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Pownce
  • Technorati
  • MisterWong

Geschrieben am Freitag, 20. November 2009, von Alex, abgelegt unter Allgemein

Tags: , ,

Andere Beiträge mit ähnlichen Inhalten, die Dich evtl. auch interessieren könnten:

Eine Antwort hinterlassen