1

エラーが発生した後にトランザクションを自動的にロールバックするために、PostgreSQLストアドプロシージャに例外処理を追加しています。

私の問題は、例外をキャッチすると、libpqを使用する呼び出し元のCプログラムにエラーの詳細を返すことができないことです。

重大度、SQLSTATE、プライマリ、詳細、およびヒントはすべてnullです。例外をキャッチした後にこれらを返す方法はありますか?

これらの値を収集するために使用するlibpq関数はPQresultErrorField()です。

4

2 に答える 2

3

例外が発生すると自動的に postgresql トランザクションがロールバックされますが、なぜそれをキャッチするのでしょうか? 例外をキャッチすることは、通常、エラーを伝播するのではなく、エラーから有効に回復したい場合にのみ役立ちます。

于 2012-03-23T13:34:12.013 に答える
1

最近、 dba.SE のエラー メッセージに CONTEXT を追加する完全なソリューションを投稿しました。エラー/警告/通知/などを発生させる関数を呼び出すのがコツです。

あなたの場合は違うかもしれないと今気づきました。私の回避策は、自分で発生させた例外に CONTEXT を追加することです。

トランザクションがロールバックされる前に何かを行うために例外をキャッチする場合はRAISE、例外ブロックの最後にパラメーターなしで追加することをお勧めします。

RAISE;

RAISE に関するマニュアル:

RAISE の最後のバリアントには、パラメーターがまったくありません。この形式は、BEGIN ブロックの EXCEPTION 句内でのみ使用できます。現在処理されているエラーが再スローされます。

ただし、@araqnid が指摘したように、とにかくエラーを伝播し、すべてがロールバックされる場合、例外ブロックには使用されません。この解決策は、 dblink呼び出しのように、特定の変更が永続的でロールバックできないまれなケースにのみ役立ちます...

于 2012-03-23T13:28:46.773 に答える