“不要使用错误进行流量控制”公理适用于 postgres 吗?

Fre*_*eit 5 postgresql condition error-handling plpgsql

在传统编程中,有一条公理:“不要使用错误进行流程控制”。一个常见的示例是抛出错误然后捕获错误,而不是使用普通的条件语句或break语句。这是有害的,因为应用程序必须展开调用堆栈并调用一些相对昂贵的异常处理逻辑,而不是简单地处理条件语句。

我正在使用 Postgres 系统,其中用户在 Postgres 中调用一个函数,该函数在不满足条件时抛出错误而不是不返回任何行。该条件大致是“此输入值不存在,无事可做”,而不是真正的例外情况。

当以与传统编程类似的方式抛出错误时,Postgres 是否会产生运行时成本?换句话说,在 Postgres 中使用异常作为流量控制对性能有害还是只是草率?

Erw*_*ter 6

从我的头脑中无法说出异常情况下事件的确切顺序。但我可以告诉你,它相对昂贵,除非需要,否则应该避免。异常(错误)会导致周围事务回滚,除非被捕获。

但要捕获错误,您需要在plpgsql 块中(在函数过程或语句中)有一个EXCEPTION子句。而且在 plpgsql 函数块中一开始就有一个子句(即使没有引发异常)的成本很高,因为这样的块实际上形成了一个子事务(可能会回滚),从而产生更多的开销。因此,手册警告:DOEXCEPTION

包含子句的块的EXCEPTION进入和退出成本明显高于没有子句的块。因此,如无必要,请勿使用EXCEPTION