捕获所有错误 psql 函数异常
Posted
技术标签:
【中文标题】捕获所有错误 psql 函数异常【英文标题】:Catch all error psql function exception 【发布时间】: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;
代替唯一异常,应该是任何异常...
【问题讨论】:
【参考方案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)可能是更好的解决方案。以上是关于捕获所有错误 psql 函数异常的主要内容,如果未能解决你的问题,请参考以下文章