在Python应用程序中,我正在捕获从我的数据库中的存储过程抛出的异常psycopg2.InternalError
。我注意到,当它们从触发器中抛出时,异常消息会随我抛出的任何消息以及当前上下文一起出现。
由于我将错误消息转发给用户,我想从中删除上下文部分。
我过去使用正则表达式做过这个,但我觉得必须有更好的方法。
显然存在一个名为PQsetErrorVerbosity
的低级函数,它存在于此特定用途,但我不确定psycopg2是否有任何可用的东西。
答案 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!'