GT.Mは、実行時(run-time)まで、間接指定、I/Oデバイスの機能、プログラムロジックに関連付けられた特定のエラータイプを検出できません。また、コンパイル時に書かれる(compile-as-written)機能は、実行パスにそれらを検出する時に、GT.Mに実行時のレポートするエラーが残る場合があります。 実行時に、GT.Mは標準エラー出力stderrに発生したすべてのエラーを報告します。ランタイムシステムは、エラーを検出するとすぐに、ルーチンの正常な実行を中断します。
GT.Mは、ダイレクトモード(コマンドラインで)または通常のプログラムの実行中に、それらを検出するかどうかに応じて異なるようにエラーに応答します。
実行しているGT.Mイメージがエラーを検出すると:
もしダイレクトモードが呼び出しスタックの一番上でアクティブである場合、GT.Mはダイレクトモードに留まります。
そうでなければ、もしエラーがEXCEPTIONを持つデバイスから来る場合、GT.MはEXCEPTIONの文字列を実行します。
そうでなければ、もし$ETRAP"="" ならば、GT.Mの転送は、エラーの時点であたかも挿入されていたかのように、$ETRAPで定義されたコードを制御します。$ECODEの'="" を除いて、この場合 QUIT:$QUIT "" QUITに続くTROLLBACK:$TLEVELを実行します。
そうでなければ、if $ZTRAP'="" の場合、GT.Mは$ZTRAPを実行します。
そうでない場合は、GT.Mは、QUIT:$QUIT "" QUIT を実行し、新しいスタックレベルでエラーを再発行します、もし他のエラートラップ($ETRAPまたは$ZTRAP)がスタックを降順で明らかにされていない場合は、GT.Mは、プリンシパルデバイス上にエラーを報告し、イメージを終了します。
アクションの後、もしあれば、$ETRAP、$ZTRAPまたはEXCEPTIONによって起動されます:
もしプロセスがダイレクトモードで終わっている場合 - 実行される文字列内でBREAKを行うのか、ダイレクトモードでの起動のとちらかの結果として - GT.Mは、プリンシパルデバイスにエラーを報告します。
[参考]もし実行された文字列がコントロールの非スタック転送が含まれる場合は、唯一暗黙の動作は、$ECODE'="" かつ $ZTRAP'="" である限りは、あり、現在のエラーのレベルからQUITする試みは、新しいスタックレベルで再発行されるそのエラーを引き起こします。
そうでなければ、if $ETRAP'="" ならば、GT.Mは、QUIT$QUIT "" QUIT を実行し、新しいスタックレベルでのエラーを再発行します。
そうでなければ、$ZTRAPはコードを含まれている必要があり、GT.Mはエラーが発生したMの行を再試行します。
GT.Mがダイレクトモードでエラーを検出する時は、メッセージでエラーを報告し、GTM> プロンプトでプロセスを残します。
例:
GTM>ZW ZW ^_____ %GTM-E-INVCMD, Invalid command keyword encountered GTM>
ダイレクトモードでは、GT.Mは、RECALLコマンドへのアクセスを提供します。RECALLは、最小限のタイピング入力でダイレクトモードのコマンドラインを取得することができます。GT.Mラインエディタでは、コマンドラインに変更または修正をすばやく行うことができます。RECALLとラインエディタの詳細については、 第4章: “ダイレクトモードでの操作とデバッグ” を参照してください。
もしGT.Mがダイレクトモードで入力されたコードの外側でエラーが発生した場合、GT.Mは$ETRAPまたは$ZTRAP特殊変数を実行し、もしそれらのどちらか1つがゼロより大きい長さを持っている場合、任意の時点で持つことができます。
$ETRAPと$ZTRAP 固有な特殊変数が、ルーチン実行中にエラーが発生した時に、GT.Mが行うべきアクションを指定します。$ETRAPと$ZTRAPは、"アクション" を処理する一つ以上のエラーを確立できます。
注意 | |
---|---|
環境変数 gtm_etrap は、$ETRAPの初期値を指定して、ベース・レベル・エラー・ハンドラとして $ZTRAP のデフォルト値 "B" を上書きします。gtmprofileスクリプトは gtm_etrap を "Write:(0=$STACK) ""Error occurred: "",$ZStatus,!" と設定してありますが、 ニーズに合わせてカスタマイズすることができます。 詳細は、 “ ダイレクトモードとシェルからのエラー処理” を参照してください。 |