エラーが発生した後にトランザクションを自動的にロールバックするために、PostgreSQLストアドプロシージャに例外処理を追加しています。
私の問題は、例外をキャッチすると、libpqを使用する呼び出し元のCプログラムにエラーの詳細を返すことができないことです。
重大度、SQLSTATE、プライマリ、詳細、およびヒントはすべてnullです。例外をキャッチした後にこれらを返す方法はありますか?
これらの値を収集するために使用するlibpq関数はPQresultErrorField()です。
エラーが発生した後にトランザクションを自動的にロールバックするために、PostgreSQLストアドプロシージャに例外処理を追加しています。
私の問題は、例外をキャッチすると、libpqを使用する呼び出し元のCプログラムにエラーの詳細を返すことができないことです。
重大度、SQLSTATE、プライマリ、詳細、およびヒントはすべてnullです。例外をキャッチした後にこれらを返す方法はありますか?
これらの値を収集するために使用するlibpq関数はPQresultErrorField()です。
例外が発生すると自動的に postgresql トランザクションがロールバックされますが、なぜそれをキャッチするのでしょうか? 例外をキャッチすることは、通常、エラーを伝播するのではなく、エラーから有効に回復したい場合にのみ役立ちます。
最近、 dba.SE のエラー メッセージに CONTEXT を追加する完全なソリューションを投稿しました。エラー/警告/通知/などを発生させる関数を呼び出すのがコツです。
あなたの場合は違うかもしれないと今気づきました。私の回避策は、自分で発生させた例外に CONTEXT を追加することです。
トランザクションがロールバックされる前に何かを行うために例外をキャッチする場合はRAISE
、例外ブロックの最後にパラメーターなしで追加することをお勧めします。
RAISE;
RAISE に関するマニュアル:
RAISE の最後のバリアントには、パラメーターがまったくありません。この形式は、BEGIN ブロックの EXCEPTION 句内でのみ使用できます。現在処理されているエラーが再スローされます。
ただし、@araqnid が指摘したように、とにかくエラーを伝播し、すべてがロールバックされる場合、例外ブロックには使用されません。この解決策は、 dblink呼び出しのように、特定の変更が永続的でロールバックできないまれなケースにのみ役立ちます...