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

Einleitung: Warum die grundlegende Fehlerbehandlung erst der Anfang ist



Jeder PHP-Entwickler kennt die try/catch-Konstruktion. Aber wenn ein Projekt auf Tausende von Codezeilen anwächst und die Serverlast hoch wird, reicht das einfache Abfangen von Ausnahmen nicht mehr aus. Fortgeschrittene Fehlerbehandlung ist nicht einfach nur „gefangen und vergessen“, sondern ein ganzes System: vom Logging bis zur Umwandlung von Warnungen in Ausnahmen.



In diesem Artikel behandeln wir Techniken, die Ihnen helfen, zuverlässigen und ausfallsicheren Code zu schreiben: mehrere catch-Blöcke, benutzerdefinierte Ausnahmeklassen, globale Handler und die Integration mit PSR-3-Loggern. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen von PHP vertraut sind.



1. Mehrere catch-Blöcke und die Ausnahmehierarchie



Seit PHP 7.1 können Sie verschiedene Ausnahmetypen in einem einzigen try-Block abfangen. Dies ermöglicht eine gezielte Reaktion auf Fehler:



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

try { // Code, der verschiedene Ausnahmen werfen kann $user = $db->query('SELECT ...'); if (!$user) { throw new DatabaseException('Abfragefehler'); } if (empty($user['email'])) { throw new ValidationException('E-Mail ist erforderlich'); }} catch (DatabaseException $e) { // DB-Fehler protokollieren error_log('DB-Fehler: ' . $e->getMessage()); echo 'Vorübergehender Serverfehler. Bitte versuchen Sie es später erneut.';} catch (ValidationException $e) { // Dem Benutzer eine verständliche Nachricht anzeigen echo 'Fehler: ' . htmlspecialchars($e->getMessage());} catch (\\Throwable $e) { // Alles andere abfangen (einschließlich Error) error_log('Kritisch: ' . $e->getMessage()); echo 'Kritischer Fehler.';}?>


Warum ist das wichtig? Jeder Ausnahmetyp erfordert eine eigene Reaktion. Ein DB-Fehler – Details vor dem Benutzer verbergen, ein Validierungsfehler – das Formular mit hervorgehobenem Feld anzeigen, ein kritischer Fehler – eine Benachrichtigung an den Administrator senden.



Beachten Sie \\Throwable – dies ist das Interface, das sowohl von Exception als auch von Error (schwerwiegende PHP-Fehler) implementiert wird. Verwenden Sie es im letzten catch-Block, um keinen Fehler zu verpassen.



2. Benutzerdefinierte Ausnahmeklassen: Standards erweitern



Die Standardklasse \\Exception bietet grundlegende Funktionalität. In realen Projekten ist es jedoch praktisch, eigene Ausnahmehierarchien zu erstellen – das vereinfacht das Debugging und die Verarbeitung.



Beispiel einer Struktur für eine Webanwendung:



<?phpnamespace App\\Exceptions;

// Basisausnahme der Anwendungclass AppException extends \\RuntimeException{ protected $context = [];

public function __construct(string $message = '', int $code = 0, ?\\Throwable $previous = null, array $context = []) { parent::__construct($message, $code, $previous); $this->context = $context; }

public function getContext(): array { return $this->context; }}

// Ausnahme für HTTP-Fehlerclass HttpException extends AppException{ private int $statusCode;

public function __construct(int $statusCode, string $message = '', array $context = []) { $this->statusCode = $statusCode; parent::__construct($message, $statusCode, null, $context); }

public function getStatusCode(): int { return $this->statusCode; }}

// Verwendungthrow new HttpException(404, 'Seite nicht gefunden', ['uri' => $_SERVER['REQUEST_URI']]);?>


Vorteile:

  • Sie können zusätzlichen Kontext übergeben (Anfrageparameter, Benutzer-ID) – das vereinfacht das Logging.
  • Ausnahmen werden nach Bedeutung gruppiert: HttpException, ValidationException, PaymentException.

Blogs

Buchempfehlungen