記事
· 2023年8月1日 2m read

BACK^%ETN でスタックトレースを確認する方法

あるメソッドやルーチンを実行してエラーとなった場合、エラー発生個所はエラーメッセージより取得することができますが、処理の呼び出し履歴(スタックトレース)はエラーメッセージのみではわかりません。
また、.Net や Python など IRIS 外からの呼び出しの場合に、エラー情報の詳細がクライアントに返らない場合などもあるかと思います。

/// 例:エラーメッセージだけでは、エラーが発生した処理の呼び出し履歴まではわからない。
USER>d ##class(User.Test).TestMethod1()
 
 write a
 ^
<UNDEFINED>TestMethod3+1^User.Test3.1 *a
USER 4e1>


そんなときは、エラー処理にて Do BACK^%ETN を実施することで、IRIS側で強制的にスタック情報を記録することができます。
スタック情報を記録することで、どのような処理がどの順番で呼び出されたかや、エラー時の内部変数情報を知ることができます。

BACK^%ETN は、エラー発生後に $ZError($ZE) 変数に値が set されている場合、アプリケーションエラーログ(^ERRORS)に情報が記録されます。
上のエラーの場合の $ZE は、以下のように確認できます。

>write $ZE
<UNDEFINED>TestMethod3+1^User.Test3.1 *a


スタック情報は、以下のようになります。こちらよりスタックトレースを確認することが可能となります。

※こちらは管理ポータルで確認した結果になります。
  [システムオペレーション] > [システムログ] > [アプリケーションエラーログ]


これらの情報は、ネームスペースごとに ^ERRORS グローバルに保存されます。

内容をファイル等に出力したい場合、管理ポータルやターミナルでグローバルをエクスポートするほかに、以下の方法でも取得することができます。

アプリケーションエラー(^ERRORS)をコマンドで取得する方法


BACK^%ETN  の使用方法は以下のようになります。

/// エラートラップに「 do BACK^%ETN 」を実装
try {
  ...
}
catch error {
  :
  do BACK^%ETN // この行を追加
}

または、

/// $ZError に値が set されているエラー発生後に、以下実行
USER>do ##class(User.Test).TestMethod1()
 
 write a
 ^
<UNDEFINED>TestMethod3+1^User.Test3.1 *a
USER 4e1>do BACK^%ETN


詳細は以下のドキュメントをご覧ください。

アプリケーション・エラーログの作成

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください