在触发器中引发时抑制/过滤异常上下文

时间:2014-09-18 05:05:42

标签: python postgresql psycopg2

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

由于我将错误消息转发给用户,我想从中删除上下文部分。

我过去使用正则表达式做过这个,但我觉得必须有更好的方法。

显然存在一个名为PQsetErrorVerbosity的低级函数,它存在于此特定用途,但我不确定psycopg2是否有任何可用的东西。

1 个答案:

答案 0 :(得分:1)

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

你应该做的是using the Diagnostics object in the exception

实施例

假设:

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;

import psycopg2
conn = psycopg2.connect('');
curs = conn.cursor();
try:
     curs.execute("SELECT call_do_exception()")
except psycopg2.InternalError, ex:
    saved_ex = ex

我收到一条上下文消息:

>>> 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.message_primary
'eep!'