在Postgresql中捕获异常后,将错误详细信息返回给调用函数

时间:2012-03-23 13:04:42

标签: database postgresql exception-handling libpq

我正在向PostgreSQL存储过程添加异常处理,以便在发生错误后自动回滚事务。

我的问题是,一旦我捕获异常,那么我就无法将错误的细节返回给使用libpq的调用C程序。

严重性,SQLSTATE,主要,详细信息和提示均为空。在捕获异常后有没有办法返回这些?

我用来收集这些值的libpq函数是PQresultErrorField()。

2 个答案:

答案 0 :(得分:2)

鉴于异常会自动使postgresql事务回滚,为什么要抓住它呢?捕获异常通常仅在您希望有效地从错误中恢复而不是传播它时才有用。

答案 1 :(得分:1)

我最近发布了complete solution how to add a CONTEXT to error messages on dba.SE。诀窍是调用一个引发错误/警告/通知等的函数

我现在意识到你的情况可能会有所不同。我的解决方法是为您自己提出的异常添加一个CONTEXT。

如果在回滚事务之前捕获异常以执行操作,则可能需要在异常块的末尾添加不带参数的RAISE

RAISE;

manual about RAISE

  

RAISE的最后一个变种根本没有参数。这个表格只能   在BEGIN块的EXCEPTION子句中使用;它会导致错误   目前正在处理以重新抛出。

然而,正如@araqnid所指出的那样,如果你要传播错误并且所有被回滚,那么在异常块中没有使用。此解决方案仅适用于某些更改持久且无法回滚的极少数情况,例如dblink调用...