Thread: BUG #16405: Exception P0004 not caught in EXCEPTION WHEN OTHERS
The following bug has been logged on the website: Bug reference: 16405 Logged by: Jacob Crell Email address: jacobcrell@gmail.com PostgreSQL version: 10.0 Operating system: AWS Aurora Description: Create below function to return assertion failue: CREATE OR REPLACE FUNCTION assert_fail() RETURNS void LANGUAGE plpgsql AS $function$ BEGIN ASSERT FALSE, 'Assertion Failed'; END; $function$; Create this function to call above function and catch error: CREATE OR REPLACE FUNCTION catch_assert_fail() RETURNS text LANGUAGE plpgsql AS $function$ BEGIN SELECT * FROM meta.assert_fail(); RETURN 'Function Finished'; EXCEPTION WHEN OTHERS THEN RETURN 'Hit the Other exception block'; END; $function$; Run below to call function SELECT * FROM catch_assert_fail() Excepted Behavior: P0004 exception is caught in EXCEPTION WHEN OTHERS, function returns text 'Hit the Other exception block'. Actual Behavior: P0004 exception is raised and remains uncaught.
PG Bug reporting form <noreply@postgresql.org> writes: > Excepted Behavior: P0004 exception is caught in EXCEPTION WHEN OTHERS, > function returns text 'Hit the Other exception block'. > Actual Behavior: P0004 exception is raised and remains uncaught. That's intentional, per the documentation [1]: The special condition name OTHERS matches every error type except QUERY_CANCELED and ASSERT_FAILURE. (It is possible, but often unwise, to trap those two error types by name.) regards, tom lane [1] https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
Thanks for the reply Tom! Makes sense.
On Thu, Apr 30, 2020 at 12:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
PG Bug reporting form <noreply@postgresql.org> writes:
> Excepted Behavior: P0004 exception is caught in EXCEPTION WHEN OTHERS,
> function returns text 'Hit the Other exception block'.
> Actual Behavior: P0004 exception is raised and remains uncaught.
That's intentional, per the documentation [1]:
The special condition name OTHERS matches every error type except
QUERY_CANCELED and ASSERT_FAILURE. (It is possible, but often unwise,
to trap those two error types by name.)
regards, tom lane
[1] https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING