在触发器中引发时抑制/筛选异常上下文

2024-09-28 22:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

显然,有一个名为PQsetErrorVerbosity的低级别函数是为这个特定的目的而存在的,但是我不确定psycopg2是否有任何可用的功能。你知道吗


Tags: 方法函数用户目的功能数据库应用程序消息
1条回答
网友
1楼 · 发布于 2024-09-28 22:18:57

除非没有其他选择,否则不要用正则表达式解析消息。如果措辞/格式发生了变化,或者用户处于不同的语言环境中,那么在版本更新时,它会崩溃得很厉害。你认识到这个问题真是太好了。你知道吗

你应该做的是using the ^{} 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!'

相关问题 更多 >