Auslösen und Abfangen einer Ausnahme
In diesem Schritt lernen Sie, Laufzeitfehler, bekannt als Ausnahmen (exceptions), zu behandeln. Eine unbehandelte Ausnahme beendet Ihre Funktion sofort. Sie erstellen zuerst eine Funktion, die fehlschlägt, und ändern sie dann, um die Ausnahme elegant abzufangen.
Lassen Sie uns eine Funktion simple_divide erstellen, die eine Ganzzahldivision durchführt. Diese Funktion hat einen potenziellen Fehler: Sie stürzt ab, wenn Sie versuchen, durch Null zu teilen.
CREATE OR REPLACE FUNCTION simple_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
END;
$$ LANGUAGE plpgsql;
Rufen Sie zuerst die Funktion mit gültigen Eingaben auf, um zu bestätigen, dass sie korrekt funktioniert:
SELECT simple_divide(10, 2);
Die Ausgabe ist das Ergebnis der Division:
simple_divide
---------------
5
(1 row)
Rufen Sie nun die Funktion mit einem Nenner von Null auf, um eine Ausnahme auszulösen:
SELECT simple_divide(10, 0);
Dieser Befehl schlägt fehl und gibt eine Fehlermeldung zurück. Die Ausführung der Funktion wird abgebrochen.
ERROR: division by zero
CONTEXT: PL/pgSQL function simple_divide(integer,integer) line 3 at RETURN
Dies ist eine unbehandelte Ausnahme. Um zu verhindern, dass die Funktion abstürzt, können Sie einen EXCEPTION-Block verwenden. Lassen Sie uns eine neue Funktion safe_divide erstellen, die eine Fehlerbehandlung enthält.
CREATE OR REPLACE FUNCTION safe_divide(numerator INTEGER, denominator INTEGER)
RETURNS INTEGER AS $$
BEGIN
RETURN numerator / denominator;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'Error: Cannot divide by zero.';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
So funktioniert der EXCEPTION-Block:
BEGIN...END;: Dies definiert einen Codeblock.
EXCEPTION: Dieses Schlüsselwort startet den Abschnitt zur Ausnahmebehandlung.
WHEN division_by_zero THEN: Dies gibt an, dass der folgende Code nur ausgeführt werden soll, wenn ein division_by_zero-Fehler auftritt.
- Der Code innerhalb des Handlers löst eine Benachrichtigung aus und gibt
NULL zurück, anstatt abzustürzen.
Rufen Sie nun die neue Funktion safe_divide mit einem Nenner von Null auf:
SELECT safe_divide(10, 0);
Dieses Mal stürzt die Funktion nicht ab. Sie fängt die Ausnahme ab, zeigt Ihre benutzerdefinierte Benachrichtigung an und gibt NULL zurück.
NOTICE: Error: Cannot divide by zero.
safe_divide
-------------
(1 row)
Sie haben erfolgreich eine spezifische Ausnahme abgefangen und die Ausgabe der Funktion gesteuert.