PHP Try Catch-Beispiel: Tutorial zur Ausnahme- und Fehlerbehandlung
⚡ Intelligente Zusammenfassung
Fehlerbehandlung und Ausnahmen in PHP sorgen für Stabilität und Sicherheit von Anwendungen, indem sie unerwartete Zustände abfangen, anstatt Fehler ungefiltert offenzulegen. Diese Einführung erklärt den Unterschied zwischen Fehlern und Ausnahmen, die `die`-Anweisung, benutzerdefinierte Fehlerbehandler, Fehlerberichtsebenen und das `try-throw-catch`-Ausnahmemodell mit verschiedenen Ausnahmetypen.

Was ist eine Ausnahme?
Ein Fehler ist ein unerwartetes Programmergebnis, das vom Programm selbst nicht verarbeitet werden kann.
Fehler werden durch die Korrektur des Programms behoben. Ein Beispiel für einen Fehler wäre eine Endlosschleife, deren Ausführung nie aufhört.
Eine Ausnahme ist ein unerwartetes Programmergebnis, das vom Programm selbst behandelt werden kann.
Ein Beispiel für eine Ausnahme ist der Versuch, eine nicht existierende Datei zu öffnen.
Diese Ausnahme kann entweder dadurch behoben werden, dass die Datei erstellt wird, oder indem dem Benutzer die Möglichkeit geboten wird, nach der Datei zu suchen.
Warum Ausnahmen behandeln?
- Unerwartete Ergebnisse auf unseren Seiten zu vermeiden, die für unsere Endnutzer sehr ärgerlich oder irritierend sein können.
- Verbessern Sie die Sicherheit unserer Anwendungen, indem Sie keine Informationen preisgeben, die böswillige Benutzer zum Angriff auf unsere Anwendungen verwenden könnten
- PHP-Ausnahmen werden verwendet, um den normalen Programmablauf zu ändern, wenn ein vorhersehbarer Fehler auftritt.
PHP-Fehlerbehandlung
Wenn ein Fehler auftritt, abhängig von Ihren Konfigurationseinstellungen, PHP zeigt die Fehlermeldung im Webbrowser mit Informationen zum aufgetretenen Fehler an.
PHP bietet verschiedene Möglichkeiten zur Fehlerbehandlung. Wir werden uns drei gängige Methoden ansehen:
- Die Aussagen Die Funktion `die` vereint die Funktionen `echo` und `exit` in einer einzigen Funktion. Sie ist sehr nützlich, wenn wir bei einem Fehler eine Meldung ausgeben und die Skriptausführung beenden möchten.
- Benutzerdefinierte Fehlerhandler – Dies sind benutzerdefinierte Funktionen, die immer dann aufgerufen werden, wenn ein Fehler auftritt.
- PHP-Fehlermeldung Die Fehlermeldung hängt von Ihren PHP-Fehlerberichterstattungseinstellungen ab. Diese Methode ist in einer Entwicklungsumgebung sehr hilfreich, wenn Sie die Fehlerursache nicht kennen. Die angezeigten Informationen können Ihnen bei der Fehlersuche in Ihrer Anwendung helfen.
Beispiele für die Fehlerbehandlung
Schauen wir uns nun einige einfache Beispiele mit Fehlerbehandlungsroutinen an.
Angenommen, wir haben eine Berechnung, die eine Zahl durch Null teilen könnte. Wir möchten diesen Fall sauber behandeln, anstatt dass PHP einen einfachen Fehler ausgibt.
Der folgende Code implementiert das obige Beispiel.
<?php
$denominator = 0;
echo 2 / $denominator;
?>
Angenommen, Sie haben die Datei simple_error.php im Ordner phptuts gespeichert, öffnen Sie die URL http://localhost/phptuts/simple_error.php
Sie erhalten die folgenden Ergebnisse.
Wie Sie den obigen Ergebnissen entnehmen können, wirkt unsere Anwendung dadurch unprofessionell und kann für den Benutzer lästig sein.
Wir werden den obigen Code modifizieren und eine Fehlerbehandlungsroutine für die Anwendung schreiben.
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Angenommen, Sie haben den obigen Code als error_handling.php gespeichert, öffnen Sie die URL http://localhost/phptuts/error_handling.php
Hinweis: Aus Sicherheitsgründen empfiehlt es sich, eine Meldung wie die oben gezeigte anzuzeigen, anstatt eine einfache Meldung wie „Datei nicht gefunden“ anzuzeigen.
Betrachten wir ein weiteres Beispiel, das einen benutzerdefinierten Fehlerbehandler verwendet.
Der benutzerdefinierte Fehlerhandler wird als standardmäßige PHP-Fehlerbehandlungsfunktion festgelegt und zeigt grundsätzlich eine Fehlernummer und eine Fehlermeldung an.
Der folgende Code veranschaulicht die Implementierung des obigen Beispiels.
<?php function my_error_handler($error_no, $error_msg) { echo "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Öffnen Sie den Microsoft Store auf Ihrem Windows-PC URL http://localhost/phptuts/custom_error_handler.phpSie erhalten die folgenden Ergebnisse.
Wie Sie dem obigen Beispiel entnehmen können, sind benutzerdefinierte Fehlerbehandlungsroutinen insofern leistungsstark, als dass:
- Sie ermöglichen uns, die Fehlermeldungen anzupassen.
- Der benutzerdefinierte Fehlerbehandler kann auch die Protokollierung von Fehlern in einer Datei oder Datenbank, das Versenden einer E-Mail an den Entwickler und ähnliche Aktionen umfassen.
Betrachten wir nun die dritte Art der Fehlerbehandlung. Wir verwenden dazu die in PHP integrierte Funktion `error_reporting`. Ihre grundlegende Syntax lautet wie folgt.
<?php error_reporting($reporting_level); ?>
HIER,
- „error_reporting“ ist die PHP-Fehlerberichtsfunktion
- Die Variable „$reporting_level“ ist optional und dient zur Festlegung des Berichterstattungsgrades. Wird kein Berichterstattungsgrad angegeben, verwendet PHP den in der php.ini-Datei festgelegten Standard-Fehlerberichterstattungsgrad.
| Berichtsebene | Beschreibung | Beispiel |
|---|---|---|
| E_WARNUNG | Zeigt nur Warnmeldungen an. Stoppt die Ausführung des Skripts nicht | error_reporting(E_WARNING); |
| E_NOTICE | Zeigt Hinweise an, die während der normalen Ausführung eines Programms auftreten können oder ein Fehler sein könnten. | Fehlerberichterstattung(E_NOTICE); |
| E_USER_ERROR | Zeigt vom Benutzer generierte Fehler an, d. h. eine benutzerdefinierte Fehlerbehandlung. | Fehlerberichterstattung(E_USER_ERROR); |
| E_USER_WARNUNG | Zeigt vom Benutzer generierte Warnmeldungen an | error_reporting(E_USER_WARNING); |
| E_USER_NOTICE | Zeigt vom Benutzer erstellte Benachrichtigungen an | error_reporting(E_USER_NOTICE); |
| E_RECOVERABLE_ERROR | Zeigt Fehler an, die nicht schwerwiegend sind und mithilfe benutzerdefinierter Fehlerbehandlungsroutinen behandelt werden können. | error_reporting(E_RECOVERABLE_ERROR); |
| E_ALL | Zeigt alle Fehler und Warnungen an | Fehlerberichterstattung(E_ALL); |
Unterschied zwischen Fehlern und Ausnahmen
- Ausnahmen werden ausgelöst und sollen abgefangen werden, Fehler hingegen sind in der Regel nicht behebbar.
- Ausnahmen werden objektorientiert behandelt. Das bedeutet, dass beim Auftreten einer Ausnahme ein Ausnahmeobjekt erstellt wird, das die Details der Ausnahme enthält.
Die folgende Tabelle zeigt die Methoden des Ausnahmeobjekts.
| Methodik | Beschreibung | Beispiel |
|---|---|---|
| getMessage () | Zeigt die Meldung der Ausnahme an |
<?php
echo $e->getMessage();
?>
|
| bekommenCode() | Zeigt den numerischen Code an, der die Ausnahme darstellt |
<?php
echo $e->getCode();
?>
|
| eine Datei bekommen() | Zeigt den Dateinamen und den Pfad an, in dem die Ausnahme aufgetreten ist |
<?php
echo $e->getFile();
?>
|
| getLine() | Zeigt die Zeilennummer an, in der die Ausnahme aufgetreten ist |
<?php
echo $e->getLine();
?>
|
| bekommenTrace() | Zeigt eine Anordnung der Rückseite antrace vor der Ausnahme |
<?php print_r( $e->getTrace()); ?> |
| getPrevious() | Zeigt die vorherige Ausnahme vor der aktuellen an |
<?php
echo $e->getPrevious();
?>
|
| bekommenTraceAsString() | Zeigt die Rückseitetrace der Ausnahme als Zeichenkette anstatt als Array |
<?php
echo $e->getTraceAsString();
?>
|
| __toString() | Zeigt die gesamte Ausnahme als Zeichenfolge an |
<?php
echo $e->__toString();
?>
|
Unten finden Sie die grundlegende Syntax zum Auslösen einer Ausnahme.
<?php throw new Exception("This is an exception example"); ?>
HIER,
- „throw“ ist das Schlüsselwort, mit dem die Ausnahme ausgelöst wird
- „new Exception(…)“ erzeugt ein Ausnahmeobjekt und übergibt die Zeichenkette „Dies ist ein Ausnahmebeispiel“ als Nachrichtenparameter.
Der obige Code gibt die folgende Meldung aus.
Wir sehen uns nun ein Beispiel an, das die Ausnahmebehandlungsmethoden `throw` und `catch` implementiert. Wir werden das obige Beispiel modifizieren und `try`, `throw` und `catch` hinzufügen.
Es hat die folgende grundlegende Syntax.
<?php try { // code goes here that could potentially throw an exception } catch (Exception $e) { // exception handling code goes here } ?>
HIER,
- „try{…}“ ist der auszuführende Codeblock, der möglicherweise eine Ausnahme auslösen könnte
- „catch(Exception $e){…}“ ist der Codeblock, der die ausgelöste Ausnahme abfängt und das Ausnahmeobjekt der Variablen $e zuweist.
Der folgende Code zeigt ein einfaches Beispiel für eine Ausnahmebehandlung mit implementierten try-, throw- und catch-Anweisungen. Das Programm löst absichtlich eine Ausnahme aus, die anschließend abgefangen wird.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Öffnen Sie den Microsoft Store auf Ihrem Windows-PC URL http://localhost/phptuts/exception_handling.phpSie erhalten die folgenden Ergebnisse.
Es ist auch möglich, für eine PHP-try-Anweisung mehrere Ausnahmen zu erstellen, abhängig vom Typ der ausgelösten Ausnahme.
Siehe den Artikel am MySQLPHP-Datenzugriff für Implementierungsbeispiele mit mehreren Ausnahmen.
Mehrere Ausnahmen
Mehrere Ausnahmen verwenden mehrere Catch-Blöcke, um die ausgelösten Ausnahmen zu behandeln. Mehrere Ausnahmen sind nützlich, wenn:
- Sie möchten abhängig von der ausgelösten Ausnahme eine angepasste Meldung anzeigen
- Sie möchten eine eindeutige Operation abhängig von der ausgelösten Ausnahme ausführen
Das folgende Flussdiagramm veranschaulicht die Funktionsweise mehrerer Ausnahmen.
Betrachten wir ein Beispiel, das mehrere Ausnahmen verwendet. Wir werden den Code modifizieren, der eine Zahl durch den übergebenen Nenner teilt.
Wir erwarten das Auftreten zweier Arten von Ausnahmen:
- Durch Null teilen
- Division durch eine negative Zahl
Der Einfachheit halber zeigen wir in unseren Catch-Blöcken nur den Ausnahmetyp an. Die PHP-eigene Klasse `Exception` dient zum Auslösen von Ausnahmen. Wir erstellen zwei Klassen, die von der Klasse `Exception` erben, und verwenden diese zum Auslösen von Ausnahmen.
Der folgende Code zeigt die Implementierung.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Testen des Codes
Wir gehen davon aus, dass Sie die Datei multiple_exceptions.php im Ordner phptuts gespeichert haben.
Navigieren Sie zu URL http://localhost/phptuts/multiple_exceptions.php
Wechseln Sie zurück zur PHP-Datei und übergeben Sie -1 als Parameter, wie im folgenden Diagramm gezeigt.
Navigieren Sie zu URL http://localhost/phptuts/multiple_exceptions.phpWelche Ergebnisse erhalten Sie? Übergeben Sie nun 3 als Parameter. Welche Ergebnisse erhalten Sie?
Der „finally“-Block und das PHP 7-Fehlermodell
Modernes PHP ergänzt das obige Modell um zwei wichtige Elemente. Der finally-Block wird nach try und catch ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wurde. Dadurch eignet er sich ideal für Aufräumarbeiten wie das Schließen einer Datei oder einer Datenbankverbindung.
Seit PHP 7 werden viele ehemals schwerwiegende Fehler als Error-Objekte ausgelöst. Sowohl Exception als auch Error implementieren das Throwable-Interface, sodass ein catch (\Throwable $e)-Block beide abfangen kann.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
Hier löst die Division durch Null in PHP 8 einen DivisionByZeroError aus, der catch-Block meldet dies, und der finally-Block wird immer ausgeführt und gibt seine Meldung aus, unabhängig davon, ob ein Fehler aufgetreten ist oder nicht.








