首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法从用plpy.Error引发的异常中删除“`plpy.error`:”前缀?

有没有办法从用plpy.Error引发的异常中删除“`plpy.error`:”前缀?
EN

Stack Overflow用户
提问于 2019-11-05 22:04:44
回答 2查看 318关注 0票数 2

在PL/pgSQL函数中,RAISE EXCEPTION 'mymessage' USING ...;将以“mymessage”作为错误消息,而在PL/ plpy.error('mymessage', ...)函数中,plpy.error('mymessage', ...)将以“plpy.Error:mymessage”作为错误消息。是否有一种直接的方法从错误消息中删除该前缀?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-06 13:18:48

恐怕你无论如何也改不掉。这是精心设计的。它有一点不同的语义。在plpgsql内部,您可以直接引发PostgreSQL异常。在Python中是不可能的-- plpy.Error的python异常被引发、捕获并转换为PostgreSQL异常-- "plpy.Error“是异常的名称。可以有任何其他异常的名称。

在本例中,Python异常的约定是- level: name: text

你可以看到

代码语言:javascript
复制
ERROR:  ZeroDivisionError: division by zero
ERROR:  plpy.Error: some text

也没有可能改变这种状况。这是故意的-这是惯例。

PLpgSQL没有这个约定--但PLpgSQL与Postgres的集成程度要高得多。它没有自己的环境,有自己的例外。

票数 1
EN

Stack Overflow用户

发布于 2020-10-27 17:19:02

如果您确实必须在异常消息中具有一致性,则可以将python函数封装在plpgsql函数中并编辑该消息。

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION my_fn_py()
    RETURNS VOID
    LANGUAGE plpython3u VOLATILE
    AS $python$
try:
    # stuff... pretend this is a big complicated thing ...

except Exception as e:
    plpy.error('custom_error', detail = str(e))
$python$;

-- Wrapper fn to normalize the plpython exceptions
CREATE OR REPLACE FUNCTION my_fn()
    RETURNS VOID
    LANGUAGE plpgsql VOLATILE
    AS $body$
DECLARE
    _msg TEXT;
    _detail TEXT;
BEGIN
    PERFORM my_fn_py();

EXCEPTION
    WHEN OTHERS THEN
        GET STACKED DIAGNOSTICS
            _msg = MESSAGE_TEXT,
            _detail = PG_EXCEPTION_DETAIL;

        IF _msg = 'plpy.Error: custom_error' THEN
            RAISE EXCEPTION 'custom_error' -- can't use a variable here :(
                DETAIL := _detail,
                ERRCODE := P0099;
        ELSIF /* other cases... */ THEN
        ELSE
            -- Re-raise the original exception
            RAISE;
        END IF;
END
$body$;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58720173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档