Fehlerbehandlung in PHP: try/catch und mehr – vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Fehlerbehandlung in PHP: Von grundlegenden Konstrukten bis zu professionellen Mustern



Jeder PHP-Entwickler stößt früher oder später auf Situationen, in denen sich der Code nicht wie erwartet verhält. Datei nicht gefunden, Datenbank nicht verfügbar, Benutzer hat ungültige Daten eingegeben – all das sind Ausnahmesituationen. Eine durchdachte Fehlerbehandlung verwandelt eine fragile Anwendung in ein zuverlässiges System. In diesem Artikel werden wir alle Aspekte der Fehlerbehandlung in PHP behandeln: vom einfachen try/catch bis zur Erstellung eigener Ausnahmeklassen und globaler Handler.



1. Grundlagen: Das try/catch-Konstrukt und throw



In PHP sind Ausnahmen Objekte der Klasse Exception (oder ihrer Unterklassen). Der grundlegende Mechanismus besteht aus drei Schlüsselwörtern:



  • try – Block, in dem potenziell gefährlicher Code ausgeführt wird;
  • catch – Block, der die Ausnahme abfängt;
  • throw – Anweisung, die eine Ausnahme „wirft“.


Betrachten wir ein einfaches Beispiel:



<?phpfunction divide($a, $b) {    if ($b == 0) {        throw new Exception('Division durch Null nicht möglich');    }    return $a / $b;}

try { echo divide(10, 0);} catch (Exception $e) { echo 'Fehler: ' . $e->getMessage();}?>


Wenn die Ausführung throw erreicht, verlässt PHP sofort die aktuelle Funktion und sucht nach einem passenden catch-Block. Wird ein catch gefunden, wird die Ausführung dort fortgesetzt. Wenn nicht, tritt ein fataler Fehler auf.



Wichtig: Seit PHP 7 werfen die meisten internen Fehler (z. B. Division durch Null) Ausnahmen der Klasse DivisionByZeroError. Um sie abzufangen, muss der entsprechende Typ angegeben werden.



2. Erweiterte Möglichkeiten: Mehrere catch-Blöcke und finally



Oft können in einem try-Block verschiedene Arten von Ausnahmen auftreten. PHP erlaubt mehrere catch-Blöcke für verschiedene Klassen:



<?phpclass ValidationException extends Exception {}class DatabaseException extends Exception {}

try { // Code, der verschiedene Ausnahmen werfen kann} catch (ValidationException $e) { echo 'Validierungsfehler: ' . $e->getMessage();} catch (DatabaseException $e) { echo 'Datenbankfehler: ' . $e->getMessage();} catch (Exception $e) { // Allgemeiner Handler für alle anderen Ausnahmen echo 'Unbekannter Fehler: ' . $e->getMessage();}?>


Die Reihenfolge der catch-Blöcke ist wichtig: PHP prüft sie nacheinander, und der erste passende Typ fängt die Ausnahme ab. Daher wird der allgemeine catch (Exception $e) immer zuletzt gesetzt.



Der finally-Block wird in jedem Fall ausgeführt – sowohl nach erfolgreichem Abschluss des try-Blocks als auch nach dem Abfangen einer Ausnahme, selbst wenn im catch-Block ein return-Befehl steht. Dies ist der ideale Ort zum Schließen von Dateien, Freigeben von Ressourcen oder Schreiben in ein Log:



<?phpfunction readConfig($filename) {    $handle = fopen($filename, 'r');    if (!$handle) {        throw new Exception('Datei konnte nicht geöffnet werden');    }    try {        // Daten lesen        return fread($handle, filesize($filename));    } finally {        fclose($handle); // Datei wird auch bei Ausnahme geschlossen    }}?>


3. Benutzerdefinierte Ausnahmeklassen und globale Handler



Das Erstellen eigener Ausnahmeklassen ist ein mächtiges Werkzeug zur Strukturierung von Code. Es reicht aus, von Exception zu erben:



<?phpclass InvalidEmailException extends Exception {    public function __construct($email, $code = 0, Throwable $previous = null) {        $message = "Die E-Mail '$email' hat ein ungültiges Format";        parent::__construct($message, $code, $previous);    }}

function validateEmail($ema

Blogs

Buchempfehlungen