Python 在触发器内引发Suppress/filter异常上下文时

Python 在触发器内引发Suppress/filter异常上下文时,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,在Python应用程序中,我捕获数据库存储过程抛出的异常,即psycopg2.InternalError。我注意到,当它们从触发器中抛出时,异常消息将伴随我抛出的任何消息以及当前上下文 因为我正在将错误消息转发给用户,所以我想从中删除上下文部分 我以前用正则表达式做过,但我觉得一定有更好的方法 显然,有一个名为PQsetErrorVerbosity的低级函数专门用于此目的,但我不确定psycopg2是否有任何可用功能。除非绝对没有其他选择,否则不要使用正则表达式解析消息。如果措辞/格式发生变化,

在Python应用程序中,我捕获数据库存储过程抛出的异常,即
psycopg2.InternalError
。我注意到,当它们从触发器中抛出时,异常消息将伴随我抛出的任何消息以及当前上下文

因为我正在将错误消息转发给用户,所以我想从中删除上下文部分

我以前用正则表达式做过,但我觉得一定有更好的方法


显然,有一个名为
PQsetErrorVerbosity
的低级函数专门用于此目的,但我不确定psycopg2是否有任何可用功能。

除非绝对没有其他选择,否则不要使用正则表达式解析消息。如果措辞/格式发生变化,或者用户处于不同的语言环境中,则在版本更新时,它会严重中断。感谢你认识到这个问题

你应该做的是

例子 鉴于:

create or replace function do_exception() returns void as $$
begin
     raise exception 'eep!';
end;
$$ language plpgsql;

create or replace function call_do_exception() returns void as $$
begin
     PERFORM do_exception();
end;
$$ language plpgsql;
以及:

我收到了一条带有上下文的消息:

>>> print saved_ex
eep!
CONTEXT:  SQL statement "SELECT do_exception()"
PL/pgSQL function call_do_exception() line 3 at PERFORM
。。。但它也有一个
diag
字段:

>>> saved_ex.diag
<psycopg2._psycopg.Diagnostics object at 0x7f822e36c150>
>>> saved_ex.diag
<psycopg2._psycopg.Diagnostics object at 0x7f822e36c150>
>>> saved_ex.diag.message_primary
'eep!'