Exceptions in PL/pgSQL abfangen (Catching Exceptions)
In diesem Schritt lernen Sie, wie Sie Exceptions (Ausnahmen) in PL/pgSQL mit dem EXCEPTION
-Block abfangen. Die Ausnahmebehandlung ermöglicht es Ihnen, Fehler auf elegante Weise zu behandeln, zu verhindern, dass Ihre Funktion abstürzt, und informative Fehlermeldungen bereitzustellen.
Die grundlegende Struktur eines Exception-Blocks ist:
BEGIN
-- Code, der eine Exception auslösen könnte
EXCEPTION
WHEN exception_name THEN
-- Code zur Behandlung der Exception
END;
Die Schlüsselwörter BEGIN
und END
definieren den Codeblock, in dem Exceptions auftreten können. Das Schlüsselwort EXCEPTION
leitet den Abschnitt zur Ausnahmebehandlung ein. Die WHEN
-Klausel gibt den Typ der abzufangenden Exception an, und der Code nach THEN
wird ausgeführt, wenn diese Exception auftritt.
Erstellen wir eine Funktion, die versucht, eine Zahl durch Null zu teilen, und die resultierende Exception abfängt. Wir nennen sie safe_divide
.
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 'Division by zero occurred!';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Diese Funktion akzeptiert zwei Integer-Argumente, numerator
(Zähler) und denominator
(Nenner). Innerhalb des BEGIN
-Blocks wird versucht, den numerator
durch den denominator
zu teilen. Wenn der denominator
Null ist, wird eine division_by_zero
-Exception (Division durch Null) ausgelöst. Der EXCEPTION
-Block fängt diese Exception ab, gibt eine Notice aus und gibt NULL
zurück.
Rufen wir nun die Funktion mit einem Divisor von Null auf:
SELECT safe_divide(10, 0);
Sie sollten eine ähnliche Ausgabe wie diese sehen:
NOTICE: Division by zero occurred!
safe_divide
-------------
NULL
(1 row)
Die NOTICE
-Meldung "Division by zero occurred!" wird angezeigt, und die Funktion gibt NULL
zurück, was anzeigt, dass die Exception abgefangen und behandelt wurde.
Rufen wir nun die Funktion mit gültigen Eingaben auf:
SELECT safe_divide(10, 2);
Sie sollten eine ähnliche Ausgabe wie diese sehen:
safe_divide
-------------
5
(1 row)
Die Funktion gibt den korrekten Quotienten 5 zurück, ohne Exceptions auszulösen.
Sie können auch andere Arten von Exceptions abfangen, z. B. numeric_value_out_of_range
(numerischer Wert außerhalb des zulässigen Bereichs), null_value_not_allowed
(Nullwert nicht erlaubt) und others
(andere). Der others
-Exception-Handler fängt jede Exception ab, die nicht explizit durch eine vorherige WHEN
-Klausel behandelt wird.
Ändern wir die Funktion, um jede Exception abzufangen und -1 zurückzugeben:
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 'Division by zero occurred!';
RETURN NULL;
WHEN OTHERS THEN
RAISE NOTICE 'An unexpected error occurred: %', SQLERRM;
RETURN -1;
END;
$$ LANGUAGE plpgsql;
In dieser geänderten Funktion wird der OTHERS
-Exception-Handler ausgeführt, wenn eine andere Exception als division_by_zero
auftritt. SQLERRM
ist eine integrierte Variable, die die Fehlermeldung enthält, die der Exception zugeordnet ist.