BUG #16405: Exception P0004 not caught in EXCEPTION WHEN OTHERS

Started by PG Bug reporting formalmost 6 years ago3 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

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.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: PG Bug reporting form (#1)
Re: BUG #16405: Exception P0004 not caught in EXCEPTION WHEN OTHERS

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]https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING:

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

#3Jacob Crell
jacobcrell@gmail.com
In reply to: Tom Lane (#2)
Re: BUG #16405: Exception P0004 not caught in EXCEPTION WHEN OTHERS

Thanks for the reply Tom! Makes sense.

On Thu, Apr 30, 2020 at 12:04 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

Show quoted text

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