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 zeroDu 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 completeDer 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.
Aufgabe
EinfachErstellen 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 KlasseFileException, dieExceptionerweitert. Sie stellt dateibezogene Fehler in deinem System dar.FileProcessor.php: Erstelle eine KlasseFileProcessor, die Dateioperationen simuliert. Binde die Datei FileException ein. Deine Klasse sollte Folgendes enthalten:- Eine private boolesche Eigenschaft
$isOpen, die mitfalseinitialisiert wird - Eine Methode
open(string $filename): void, die$isOpenauftruesetzt und"Opening: [filename]"ausgibt. Wenn der Dateiname"invalid.txt"lautet, soll sie eineFileExceptionmit der Nachricht"Cannot open file"auslösen - Eine Methode
process(): void, die"Processing file..."ausgibt. Wenn$isOpenfalseist, soll sie eineRuntimeExceptionmit der Nachricht"File not open"auslösen - Eine Methode
close(): void, die$isOpenauffalsesetzt und"File closed"ausgibt - Eine Methode
isOpen(): bool, die den aktuellen Zustand zurückgibt
- Eine private boolesche Eigenschaft
main.php: Binde die Datei FileProcessor ein. Du erhältst eine Eingabe: einen Dateinamen.Erstelle ein Objekt von
FileProcessorund verwende einetry-catch-finally-Struktur, um Folgendes zu tun:- Im
try-Block: Rufeopen()mit dem Dateinamen auf und rufe anschließendprocess()auf - Fange zuerst
FileExceptionab und gib"File error: [message]"aus - Fange
RuntimeExceptionab und gib"Runtime error: [message]"aus - Im
finally-Block: Prüfe mitisOpen(), ob die Datei geöffnet ist, und rufe, falls dies der Fall ist,close()auf. Gib anschließend"Cleanup complete"aus
- Im
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"
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler