$ETRAP
Synopsis
$ETRAP $ET
概要
$ETRAP には、エラーが発生すると実行される 1 つまたは複数の ObjectScript コマンドを指定する文字列が含まれます。
$ETRAP は、使用可能な ObjectScript エラー処理機能のうち、最も望ましくないものです。これは使用しないようにしてください (以下の “Caché エラー処理機能” を参照)。
SET コマンドを使用して、1 つ以上の ObjectScript コマンドを含む文字列の値を $ETRAP に指定します。そして、エラーが発生すると、Caché は $ETRAP に入力したコマンドを実行します。例えば、$ETRAP をエラー処理ルーチンに制御を移す GOTO コマンドを含む文字列に設定したと仮定します。
SET $ETRAP="GOTO LOGERR^ERRROU"
エラー状態を生成する ObjectScript コマンドのすぐ後に続けて、Caché は $ETRAP のコマンドを実行します。Caché はエラー状態と同じコンテキスト・レベルで、$ETRAP コマンドを実行します。Caché は、$ETRAP が設定されている場合に有効な $ROLES 値を保存します。$ETRAP コードが実行されると、Caché は $ROLES をその保存した値に設定します。これによって、$ETRAP エラー・ハンドラで、エラー・ハンドラの設定後にルーチンに付与された上位特権が使用されないように防止できます。
$ETRAP を設定してエラー・ハンドラを実行する (例えば GOTO コマンドと共に使用する) ときは、エラー・ハンドラを label (現在のルーチン内のラベル)、^routine (指定された外部ルーチンの開始)、または label^routine (指定された外部ルーチン内の指定されたラベル) として指定できます。
$ETRAP は、一部のコンテキスト (プロシージャ以外) で label+offset をサポートしています。オプションのこの +offset は、label からオフセットする行数を指定する整数です。インターシステムズでは、エラー・ハンドラの位置の指定時には行のオフセットを使用しないことを推奨します。
SET $ETRAP 文字列の最大長は 32,741 文字です。これより長い文字列に $ETRAP を設定すると、<MAXSTRING> エラーが返される可能性があります。
XECUTE コマンドと比較した $ETRAP コマンド
$ETRAP 文字列内のコマンドは、XECUTE 文字列のコマンドと異なり、新しいコンテキスト・レベルで実行しません。また、$ETRAP コマンド文字列は、常に暗黙の QUIT コマンドによって終了します。暗黙の QUIT コマンドは、$ETRAP エラー処理コマンドが引数付きの QUIT コマンドが必要な外部関数コンテキストで呼び出されているときは、NULL 文字列の引数で終了します。
異なるコンテキスト・レベルでの $ETRAP 値の設定
既定では、Caché は $ETRAP 特殊変数の値を新しい DO、XECUTE、外部関数のコンテキストに繰り越し実行します。しかし、以下のように、NEW コマンドを使用して、コンテキストで $ETRAP で新しいコピーを作成できます。
NEW $ETRAP
$ETRAP に NEW を実行するときは常に、Caché は以下の動作をします。
-
その時点で使用中の $ETRAP のコピーを保存する
-
$ETRAP の新しいコピーを作成する
-
$ETRAP の古い保存コピーと同じ値の $ETRAP の新しいコピーを割り当てる
それから、SET コマンドを使用して、異なる値を $ETRAP の新しいコピーに割り当てます。この方法で、現在のコンテキストの $ETRAP エラー処理コマンドを作成します。
また、$ETRAP を NULL 文字列に設定することで、$ETRAP を消去することもできます。そのとき Caché は、エラーが発生したコンテキスト・レベルで $ETRAP コマンドを実行しません。
QUIT コマンドが現在のコンテキストを終了すると、Caché は $ETRAP の古い保存値に復元します。
例
以下の例は、$ETRAP の値がどのように新しいコンテキストに繰り越しされ、エラーが発生した後に各コンテキストで、どのように $ETRAP エラー処理コマンドを呼び出すことができるかを示しています。以下の例の $ETRAP コマンドは、エラーをクリアしようとはしません。既定による制御は、それぞれの前のコンテキスト・レベルで $ETRAP エラー処理コマンドに渡されます。
サンプル・コードは以下のとおりです。
ETR
NEW $ETRAP
SET $ETRAP="WRITE !,""$ETRAP invoked at Context Level "",$STACK"
; Initiate an XECUTE context that initiates a DO context
XECUTE "DO A"
QUIT
; Initiate a user-defined function context
A
SET A=$$B
QUIT
; A User-defined function that generates an error
B()
QUIT 1
このコードを使用したサンプル・セッションは、次のように実行されます。
>DO ^ETR
$ETRAP invoked at context level 4
$ETRAP invoked at context level 3
$ETRAP invoked at context level 2
$ETRAP invoked at context level 1
<COMMAND>
メモ
$ETRAP を新しい値に設定する前に NEW を使用する
最初に NEW コマンドを使用して $ETRAP の新しいコピーを作成せずに、コンテキストで $ETRAP に新しい値を割り当てるとき、Caché は現在のコンテキストだけでなく、前のすべてのコンテキストに $ETRAP 値としての新しい値を作成します。そのため、インターシステムズでは $ETRAP に新しい値を設定する前に、NEW $ETRAP コマンドを使用して $ETRAP の新しいコピーを作成することを強くお勧めします。
Caché ObjectScript コードの行である $ETRAP 値
$ETRAP の文字列値は、実行可能な ObjectScript コマンドなので、文字列長は ObjectScript ルーチン行の最大長よりも長くすることはできません。詳細は、"Caché ObjectScript の使用法" を参照してください。
Caché エラー処理機能
$ETRAP 特殊変数は、アプリケーション内で生じるエラーの処理とログを制御できる、いくつかの ObjectScript 言語形式のうちの 1 つです。
-
$ZTRAP 特殊変数は、$ETRAP よりも推奨されます。
-
$ETRAP の機能は、引き続き Caché でサポートされますが、一般に、新しいコードで $ETRAP を使用することは避けて、他のエラー処理機能を使用してください。
エラー処理に関する詳細は、"Caché ObjectScript の使用法" の "エラー処理" を参照してください。
$ETRAP と $ZTRAP
$ZTRAP を使用してエラー・ハンドラを設定するとき、このハンドラは既存のすべての $ETRAP エラー・ハンドラを優先します。NEW $ETRAP コマンドが暗黙的に実行され、$ETRAP が NULL 文字列 ("") に設定されます。
$ETRAP と TRY / CATCH
TRY コマンドと CATCH コマンドは実行レベル内でエラー処理を行います。TRY ブロック内で例外が発生すると、Caché は通常、TRY ブロックの直後に続く例外処理コードの CATCH ブロックを実行します。
TRY ブロックで構造化されたプログラムでは、$ETRAP はどうか使用しないようにしてください。
TRY ブロック内の $ETRAP を設定することはできません。これを試みると、コンパイル・エラーが生成されます。$ETRAP は、TRY ブロックの前、または CATCH ブロック内で設定できます。
$ETRAP が既に設定されており、例外が TRY ブロック内で発生する場合、Caché は、未然に阻止しない限り、CATCH ではなく、$ETRAP を取得する可能性があります。例外の発生時に $ETRAP と CATCH が両方とも存在している場合、現在の実行レベルに適用されるエラー・コード (CATCH または $ETRAP) が実行されます。$ETRAP はもともと、実行レベルに関連付けられていないため、Caché では、別に指定されない限り、現在の実行レベルに関連付けられると想定されます。$ETRAP を設定して $ETRAP のレベル・マーカーを作成する前に、NEW $ETRAP を実行する必要があります。この結果、Caché は、$ETRAP ではなく、CATCH を現在のレベルの例外ハンドラとして正しく処理することができます。そうでない場合は、システム・エラー (THROW コマンドによってスローされたシステム・エラーなど) が $ETRAP 実行ハンドラを取得する可能性があります。
CATCH ブロック内で発生する例外は、現在のエラー・トラップ・ハンドラによって処理されます。