Menu
Coddy logo textTech

Try, Catch, Finally

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 68 von 91.

Nachdem du nun weißt, wie man Ausnahmen erstellt und auslöst, musst du lernen, wie man sie catch kann. Die Struktur try-catch-finally ermöglicht es dir, Ausnahmen ordnungsgemäß zu behandeln, anstatt zuzulassen, dass sie deine Anwendung zum Absturz bringen.

Umschließe Code, der möglicherweise eine Exception auslöst, mit einem try-Block und behandle die Exception anschließend in einem catch-Block:

<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

$calc = new Calculator();

try {
    echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
    echo "Error: " . $e->getMessage();
}

Ausgabe:

Error: Cannot divide by zero

Du kannst verschiedene Exception-Typen mit mehreren catch-Blöcken abfangen. PHP prüft sie der Reihe nach. Platziere daher spezifischere Exceptions zuerst:

<?php
try {
    // riskanter Code
} catch (InvalidArgumentException $e) {
    echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
    echo "Something went wrong: " . $e->getMessage();
}

Der finally-Block wird unabhängig davon ausgeführt, ob eine Ausnahme ausgelöst oder abgefangen wurde. Er eignet sich perfekt für Aufräumarbeiten wie das Schließen von Verbindungen:

<?php
try {
    echo "Attempting operation\n";
    throw new Exception("Failed");
} catch (Exception $e) {
    echo "Caught: " . $e->getMessage() . "\n";
} finally {
    echo "Cleanup complete";
}

Ausgabe:

Attempting operation
Caught: Failed
Cleanup complete

Der finally-Block wird auch dann ausgeführt, wenn du innerhalb der Try- oder Catch-Blöcke eine Rückgabe ausführst, wodurch er zuverlässig für wesentliche Bereinigungsvorgänge geeignet ist.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Dateiverarbeitungssystem, das demonstriert, wie try-catch-finally zusammenarbeitet, um Fehler ordnungsgemäß zu behandeln und gleichzeitig sicherzustellen, dass die Bereinigung immer erfolgt.

Du organisierst deinen Code auf drei Dateien verteilt:

  • FileException.php: Erstelle eine benutzerdefinierte Klasse FileException, die Exception erweitert. Sie stellt dateibezogene Fehler in deinem System dar.
  • FileProcessor.php: Erstelle eine Klasse FileProcessor, die Dateioperationen simuliert. Binde die Datei FileException ein. Deine Klasse sollte Folgendes enthalten:
    • Eine private boolesche Eigenschaft $isOpen, die mit false initialisiert wird
    • Eine Methode open(string $filename): void, die $isOpen auf true setzt und "Opening: [filename]" ausgibt. Wenn der Dateiname "invalid.txt" lautet, soll sie eine FileException mit der Nachricht "Cannot open file" auslösen
    • Eine Methode process(): void, die "Processing file..." ausgibt. Wenn $isOpen false ist, soll sie eine RuntimeException mit der Nachricht "File not open" auslösen
    • Eine Methode close(): void, die $isOpen auf false setzt und "File closed" ausgibt
    • Eine Methode isOpen(): bool, die den aktuellen Zustand zurückgibt
  • main.php: Binde die Datei FileProcessor ein. Du erhältst eine Eingabe: einen Dateinamen.

    Erstelle ein Objekt von FileProcessor und verwende eine try-catch-finally-Struktur, um Folgendes zu tun:

    • Im try-Block: Rufe open() mit dem Dateinamen auf und rufe anschließend process() auf
    • Fange zuerst FileException ab und gib "File error: [message]" aus
    • Fange RuntimeException ab und gib "Runtime error: [message]" aus
    • Im finally-Block: Prüfe mit isOpen(), ob die Datei geöffnet ist, und rufe, falls dies der Fall ist, close() auf. Gib anschließend "Cleanup complete" aus

Der finally-Block stellt sicher, dass die Bereinigung erfolgt, unabhängig davon, ob die Operationen erfolgreich sind oder fehlschlagen. Dieses Muster ist für die Verwaltung von Ressourcen wie Dateien, Datenbankverbindungen oder Netzwerk-Sockets unerlässlich, bei denen die Bereinigung unabhängig davon erfolgen muss, was während der Verarbeitung passiert.

Probier es selbst

<?php
require_once 'FileProcessor.php';

// Eingabe lesen
$filename = trim(fgets(STDIN));

// TODO: Erstelle eine FileProcessor-Instanz

// TODO: Verwende try-catch-finally-Struktur:
// - Im try-Block: rufe open() mit dem Dateinamen auf, dann rufe process() auf
// - Fange FileException zuerst ab und gib "File error: [message]" aus
// - Fange RuntimeException ab und gib "Runtime error: [message]" aus
// - Im finally-Block: prüfe mit isOpen(), ob die Datei geöffnet ist, und rufe gegebenenfalls close() auf
//   Then print "Cleanup complete"

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-PHP-Compiler