【问题标题】:Catch all error psql function exception捕获所有错误 psql 函数异常
【发布时间】:2017-02-02 15:49:23
【问题描述】:

我正在编写一个带有异常捕获和忽略的函数。我想捕获所有异常并忽略它。有没有办法捕获所有异常而不是单独捕获?

CREATE OR REPLACE FUNCTION ADD_TABLE_TO_ARCHIVE (a TEXT, b TEXT)
RETURNS INTEGER AS $SUCCESS$
DECLARE SUCCESS INTEGER;
BEGIN
    SUCCESS = 0;
    BEGIN
        UPDATE ARCHIVE_STATUS
        SET *****
        WHERE ***;
        SUCCESS = 1;
    EXCEPTION
        WHEN UNIQUE_VIOLATION 
        SUCCESS = 0;
    END;

   RETURN SUCCESS;
END;
$SUCCESS$ LANGUAGE plpgsql;

代替唯一异常,应该是任何异常...

【问题讨论】:

    标签: exception-handling plpgsql psql


    【解决方案1】:

    你可以使用EXCEPTION WHEN OTHERS子句:

    BEGIN
      do something
    EXCEPTION WHEN OTHERS THEN
      handle any exception
    END;
    

    无一例外,使用这个子句不是一个好主意。使用此模式时,调试、问题诊断可能会很糟糕。这是一个强大的功能(有时是必要的),但很危险!

    注意 - 受保护部分的进入、结束离开有很大的负载。保存点和释放保存点的开销不小。这种构造的开销明显高于 Oracle(虽然视觉上相似,但它做不同的事情)。虽然这段代码看起来像 PL/SQL 中的代码,但实现完全不同。如果您期望应用程序的负载更高,请谨慎使用(不要在循环内,...)

    【讨论】:

    • 这种异常会锁表吗?如果是这样,断开会话会释放锁定。
    • @codeBarer - 自锁异常 - 某些命令会在表上创建锁。 Postgres 在事务结束时释放锁 - 处理异常基于创建和释放保存点。据我所知,它对锁没有任何影响。
    • @PavelStehule 您如何在此处捕获错误/异常消息并将其记录到某个表中?
    • @ennth - 最好的方法是将其发送到 Postgres 日志。后来的专用工具如 splunk,可以从 Postgres 日志中读取。或者您可以阅读 Postgres 日志,并填写一些表格。好的设计取决于大小 - 对于小型应用程序或没有大负载的应用程序,作为目标的表可能是很好的解决方案。在其他情况下,特殊工具、特殊数据库(如 influx 或 timescaledb)可能是更好的解决方案。
    猜你喜欢
    • 2015-12-18
    • 2011-08-20
    • 1970-01-01
    • 2015-06-11
    • 2020-09-12
    • 1970-01-01
    • 2018-11-01
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多