在传统编程中,有一条公理表明“不要使用错误来进行流控制”。一个普遍的例子是抛出一个错误然后捕获错误,而不是使用普通的条件语句或中断语句。这是有害的,因为应用程序必须展开调用堆栈并调用一些相对昂贵的异常处理逻辑,而不是简单地处理条件语句。
我正在使用一个 postgres 系统,其中用户在 postgres 中调用一个函数,该函数在不满足条件时抛出错误而不是不返回任何行。条件大致是“这个输入值不存在,无事可做”而不是真正的例外情况。
当以类似于传统编程的方式抛出错误时,postgres 是否会产生运行时成本?换句话说,在 postgres 中使用异常作为流控制对性能有害还是马虎?
无法从我的脑海中说出发生异常时事件的确切顺序。但我可以告诉你,它相对昂贵,除非需要,否则应避免使用。异常(错误)会导致周围事务回滚,除非被捕获。
但是要捕获错误,您需要plpgsql 块
EXCEPTION
中的子句(在函数、过程或语句中)。并且在 plpgsql 函数块中以一个子句开头(即使没有引发异常)是昂贵的,因为这样的块有效地形成了一个子事务(可能会被回滚),从而产生更多的开销。因此,手册警告:DO
EXCEPTION