我正在向 PostgreSQL 存储过程添加异常处理,以便在发生错误后自动回滚事务。
我的问题是,一旦我捕获到异常,我就无法将错误的详细信息返回给使用 libpq 的调用 C 程序。
Severity、SQLSTATE、Primary、Detail 和 Hint 都为空。有没有办法在捕获异常后返回这些?
我用来收集这些值的 libpq 函数是 PQresultErrorField()。
我正在向 PostgreSQL 存储过程添加异常处理,以便在发生错误后自动回滚事务。
我的问题是,一旦我捕获到异常,我就无法将错误的详细信息返回给使用 libpq 的调用 C 程序。
Severity、SQLSTATE、Primary、Detail 和 Hint 都为空。有没有办法在捕获异常后返回这些?
我用来收集这些值的 libpq 函数是 PQresultErrorField()。
给定一个异常会自动使 postgresql 事务回滚,为什么要捕获它呢?捕获异常通常仅在您想有效地从错误中恢复而不是传播错误时才有用。
我最近发布了一个完整的解决方案,如何将 CONTEXT 添加到 dba.SE 上的错误消息中。诀窍是调用一个引发错误/警告/通知/等的函数。
我现在意识到你的情况可能不同。我的解决方法是将 CONTEXT 添加到您自己提出的异常中。
如果您在事务回滚之前捕获异常以执行操作,您可能希望RAISE
在异常块的末尾添加一个不带参数的:
RAISE;
关于 RAISE的手册:
RAISE 的最后一个变体根本没有参数。这种形式只能在 BEGIN 块的 EXCEPTION 子句中使用;它会导致当前正在处理的错误被重新抛出。
但是,正如@araqnid 指出的那样,如果您无论如何要传播错误并且一切都回滚,则不会在异常块中使用。此解决方案仅适用于某些更改持续存在且无法回滚的极少数情况,例如dblink调用...