gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:30:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com