在 Python 应用程序中,我正在捕获从数据库中的存储过程中抛出的异常,如 psycopg2.InternalError
。我注意到,当它们从触发器中抛出时,异常消息会随我抛出的任何消息以及当前上下文一起出现。
因为我要将错误消息转发给用户,所以我想从中删除上下文部分。
我过去曾使用正则表达式来完成此操作,但我觉得一定有更好的方法。
显然有一个名为 PQsetErrorVerbosity
的低级函数是为了这个特定目的而存在的,但我不确定是否有任何东西可以通过 psycopg2 获得。
最佳答案
除非别无选择,否则不要使用正则表达式解析消息。如果措辞/格式发生变化,或者如果用户处于不同的区域设置,它会在版本更新时严重中断。很高兴你认识到这个问题。
你应该做的是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
我收到一 strip 有上下文的消息:
>>> 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!'
关于python - 在触发器中引发时抑制/过滤异常上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25904511/