Fehlerbehandlung in PHP: try/catch und fortgeschrittene Techniken

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 try/catch zu produktiven Lösungen

\n\n

Jeder PHP-Entwickler stößt auf Fehler. Das grundlegende try/catch ist nur die Spitze des Eisbergs. In diesem Artikel werden wir fortgeschrittene Techniken der Fehlerbehandlung behandeln, die zerbrechlichen Code in ein robustes System verwandeln, das korrekt auf jede Art von Störung reagieren kann.

\n\n

1. Tiefer Einstieg in try/catch: finally-Block und mehrere catch-Blöcke

\n\n

Das Standard-try/catch ist die Grundlage, aber viele vergessen den finally-Block, der immer ausgeführt wird, unabhängig davon, ob eine Ausnahme aufgetreten ist. Dies ist der ideale Ort zum Schließen von Ressourcen (Dateien, Datenbankverbindungen).

\n\n
<?php\nfunction processFile(string $filename): void {\n    $handle = fopen($filename, 'r');\n    if (!$handle) {\n        throw new \\RuntimeException("Datei konnte nicht geöffnet werden: $filename");\n    }\n    \n    try {\n        // Datei verarbeiten\n        while (($line = fgets($handle)) !== false) {\n            // ... Verarbeitungslogik\n        }\n    } catch (\\RuntimeException $e) {\n        // Spezifische Behandlung von E/A-Fehlern\n        error_log("Fehler beim Lesen der Datei: " . $e->getMessage());\n        throw $e; // Weiterwerfen nach oben\n    } catch (\\Exception $e) {\n        // Behandlung aller anderen Ausnahmen\n        error_log("Unbekannter Fehler: " . $e->getMessage());\n        throw $e;\n    } finally {\n        fclose($handle); // Datei immer schließen\n    }\n}\n?>
\n\n

Wichtig: Die Reihenfolge der catch-Blöcke ist entscheidend. Spezifischere Ausnahmen (z. B. \\RuntimeException) sollten vor allgemeineren (\\Exception) kommen. Andernfalls wird der spezifische Block niemals ausgeführt.

\n\n

2. Benutzerdefinierte Ausnahmeklassen: Semantik und Hierarchie

\n\n

Die eingebauten Ausnahmen (PDOException, RuntimeException) sind oft nicht aussagekräftig genug. Erstellen Sie Ihre eigene Ausnahmehierarchie, um Fehler nach Typen zu unterscheiden und deren Behandlung zu vereinfachen.

\n\n
<?php\n// Basisausnahme der Anwendung\nclass AppException extends \\Exception {}\n\n// Validierungsfehler\nclass ValidationException extends AppException {\n    private array $errors;\n    \n    public function __construct(array $errors, string $message = "Validierungsfehler") {\n        parent::__construct($message, 422);\n        $this->errors = $errors;\n    }\n    \n    public function getErrors(): array {\n        return $this->errors;\n    }\n}\n\n// Zugriffsfehler\nclass AccessDeniedException extends AppException {\n    public function __construct(string $message = "Zugriff verweigert") {\n        parent::__construct($message, 403);\n    }\n}\n\n// Anwendungsbeispiel\nfunction registerUser(array $data): void {\n    $errors = [];\n    \n    if (empty($data['email'])) {\n        $errors['email'] = 'E-Mail ist erforderlich';\n    }\n    if (empty($data['password'])) {\n        $errors['password'] = 'Passwort ist erforderlich';\n    }\n    \n    if (!empty($errors)) {\n        throw new ValidationException($errors);\n    }\n    \n    // Registrierungslogik...\n}\n\ntry {\n    registerUser(['email' => '']);\n} catch (ValidationException $e) {\n    // Spezifische Behandlung: JSON mit Fehlern zurückgeben\n    http_response_code(422);\n    echo json_encode(['errors' => $e->getErrors()]);\n} catch (AccessDeniedException $e) {\n    http_response_code(403);\n    echo json_encode(['error' => $e->getMessage()]);\n} catch (AppException $e) {\n    // Allgemeine Behandlung für alle anderen Anwendungsfehler\n    http_response_code(500);\n    echo json_encode(['error' => 'Interner Serverfehler']);\n}\n?>
\n\n

Tipp: Verwenden Sie HTTP-Statuscodes (400, 403, 422, 500) als Ausnahmecodes – das vereinfacht die Integration mit REST-APIs.

\n\n

3. Globaler Fehlerbehandler: ErrorHandler und ShutdownHandler

\n\n

Nicht alle Fehler können mit try/catch abgefangen werden. Fatale Fehler (E_ERROR), Warnungen (E_WARNING) und Parse-Fehler

Blogs

Buchempfehlungen