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.

  • ⚠️ Fehler vs. Ausnahme: Ein Fehler ist im Allgemeinen nicht behebbar, während eine Ausnahme ein unerwartetes Ergebnis darstellt, das das Programm abfangen und behandeln kann.
  • 🛡️ Warum handhaben: Durch die Fehlerbehandlung werden unschöne Ausgaben vermieden, die Benutzer geschützt und die Preisgabe von Details verhindert, die Angreifer ausnutzen könnten.
  • 🛑 Die Aussagen: Die Funktion `die` gibt eine Meldung aus und stoppt das Skript – eine schnelle Möglichkeit, die Ausführung zu stoppen, wenn etwas fehlschlägt.
  • ️ Benutzerdefinierte Handler: set_error_handler() leitet Fehler an Ihre eigene Funktion weiter, sodass Sie Meldungen nach Ihren Wünschen protokollieren, per E-Mail versenden oder formatieren können.
  • 📢 Fehler melden: error_reporting() und Level wie E_ALL steuern, welche Warnungen und Hinweise PHP anzeigt; dies ist während der Entwicklung nützlich.
  • 🧲 Versuchen, Werfen, Fangen: Ein try-Block führt riskanten Code aus, throw löst eine Ausnahme aus und catch behandelt diese mithilfe der Methoden des Ausnahmeobjekts.
  • 🤖 KI-Assistent: KI-Tools können bestehenden Code um try-catch-Blöcke erweitern und einen unübersichtlichen Stacktrace erklären. trace oder Fehlermeldung.

PHP-Fehlerbehandlung und Ausnahmen

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:

  1. 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.
  2. Benutzerdefinierte Fehlerhandler – Dies sind benutzerdefinierte Funktionen, die immer dann aufgerufen werden, wenn ein Fehler auftritt.
  3. 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.

PHP-Fehlerbehandlung

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

PHP-Ausnahmebehandlung in 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.

PHP-Fehlerbehandlung

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.

PHP-Ausnahmebehandlung in PHP

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.

PHP-Ausnahmebehandlung in PHP

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.

Mehrere 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

PHP-Ausnahmebehandlung in PHP

Wechseln Sie zurück zur PHP-Datei und übergeben Sie -1 als Parameter, wie im folgenden Diagramm gezeigt.

PHP-Ausnahmebehandlung in PHP

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.

Häufig gestellte Fragen

Im Produktivbetrieb sollten Sie in der php.ini `display_errors` auf `Off` und `log_errors` auf `On` setzen und `error_log` auf eine Datei verweisen lassen. Alternativ können Sie `error_log('message')` aufrufen, um benutzerdefinierte Einträge zu protokollieren, ohne diese für Besucher sichtbar zu machen.

try-catch behandelt Ausnahmen, die mit dem Schlüsselwort throw ausgelöst werden. set_error_handler fängt herkömmliche PHP-Fehler und -Warnungen ab. In PHP 7 und späteren Versionen werden viele dieser Fehler als Error-Objekte ausgelöst, die Sie ebenfalls abfangen können.

Eine nicht abgefangene Ausnahme führt zu einem schwerwiegenden Fehler, stoppt das Skript und gibt eine Fehlermeldung mit einem Stacktrace aus. trace. Ein globaler Handler, der mit set_exception_handler gesetzt wird, kann diese als letzten Ausweg abfangen.

Ja. KI kann riskante Operationen in try-catch-Blöcke einbetten, die richtigen Ausnahmetypen auswählen, einen finally-Block zur Bereinigung hinzufügen und den Fehler protokollieren. RevBeachten Sie, dass es Ausnahmen nicht ignoriert, die Sie beachten müssen.

Ja. Füge die Nachricht ein und trace, und KI kann die fehlerhafte Zeile, die Aufrufkette, die dorthin geführt hat, und die wahrscheinliche Ursache identifizieren und dann eine Lösung vorschlagen, wie z. B. eine Nullprüfung oder ein korrigiertes Argument.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: