始める無料で始める

コンテキストスタックを取得する

他の言語でいうスタックトレースに相当するスタックのコンテキストを取得すると、複雑で入れ子になった関数のデバッグにとても有効です。

以下のコードでは、スタックのコンテキストを取得し、ネストされた両方のブロックの例外ハンドラーで記録したいと考えています。続いて、errors テーブルでその出力を確認し、この関数で例外が起きている原因の調査に役立てます。

この演習はコースの一部です

PostgreSQL におけるトランザクションとエラー処理

コースを見る

演習の手順

  • スタックのコンテキストを保持する text 変数 exc_context を宣言します。
  • 最初のハンドラーで、PG_EXCEPTION_CONTEXTexc_context 変数に格納します。
  • 2 つ目のハンドラーで、PG_EXCEPTION_DETAILexc_detail 変数に格納します。
  • 両方のブロックで、エラーメッセージとスタックのコンテキストの両方を記録します。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

DO $$
DECLARE
   exc_message text;
   exc_details text;
   -- Declare a variable, exc_context to hold the exception context
   ___ ___;
BEGIN
    BEGIN
    	INSERT INTO patients (a1c, glucose, fasting) values (5.6, 93, TRUE),
        	(6.3, 111, TRUE),(4.7, 65, TRUE);
    EXCEPTION
        WHEN others THEN
        -- Store the exception context in exc_context
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        -- Record both the msg and the context
        INSERT INTO errors (msg, context) 
           VALUES (___, ___);
    END;
	BEGIN
    	UPDATE patients set fasting = 'true' where id=1;
    EXCEPTION
        WHEN others THEN
        -- Store the exception detail in exc_details
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        INSERT INTO errors (___, ___) 
           VALUES (exc_message, exc_context);
    END;
END$$;
SELECT * FROM errors;
コードを編集して実行