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

标签 python postgresql psycopg2

在 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/

相关文章:

python - Python sorted() 内置函数 vs. list insert() 方法的效率

database - 在 Sequelize.js 种子模型中引用复合主键

python - Docker 无法将 psycopg2-binary 识别为 psycopg2

python - 将 python 字典传递给 psycopg2 游标

argparse 的 python 单元测试

javascript - 如何将 Python 数据发送到 JavaScript

python - Pandas 中的简单列分割

ruby-on-rails - 如何在查询中添加uniq

python - SQLalchemy 查询获取字典的聚合数组

python - 当我使用pip构建docker时安装psycopg2有错误