$ZERROR
Synopsis
$ZERROR $ZE
説明
$ZERROR は、最新のエラーの名前、最新のエラーの場所 (該当する場所)、および (特定のエラー・コードの場合は) エラーの原因に関する詳細情報を含んでいます。$ZERROR は、適切な言語モードの最新のエラーを常に含んでいます。
$ZERROR の値は、エラーのすぐ後に続けて使用することを意図したものです。$ZERROR の値は複数のルーチン呼び出しにわたって保持することができないため、$ZERROR の値を後で使用できるように保持したいユーザは、値を変数にコピーする必要があります。$ZERROR は、使用直後に NULL 文字列 ("") に設定することを強くお勧めします。
$ZERROR に含まれている文字列は、以下のいずれかの形式になります。
<error> <error>entryref <error> info <error>entryref info
<error> | エラー名エラー名は、常に山括弧で囲まれた大文字で返されます。空白スペースが含まれていることもあります。 |
entryref |
エラーが発生したコードの行の参照。これは、ラベル名とラベルからの行オフセットで構成されます。この後には、^ とプログラム名が続きます。この entryref は、エラー名の山括弧を閉じたすぐ後に続きます。ターミナルから $ZERROR を呼び出した場合には、この entryref 情報は意味をなさないので返されません。 ZLOAD を使用してルーチン・バッファに最後にロードされたルーチンへの参照。 |
info | 特定のエラーの種類に固有の詳細情報 (以下の表を参照)。この情報は、空白スペースで <error> または <error>entryref と区切られています。info に複数のコンポーネントが存在する場合、それらはコンマで区切られます。 |
例えば、zerrortest という名前のプログラムは、ZerrorMain という以下のルーチンを含みます。これは、未定義のローカル変数 (fred) のコンテンツの記述を試みます。
ZerrorMain
TRY {
SET $ZERROR=""
WRITE "$ZERROR = ",$ZERROR,!
WRITE fred }
CATCH {
WRITE "$ZERROR = ",$ZCVT($ZERROR,"O","HTML")
}
上の例では、最初の $ZERROR は、$ZERROR が NULL 文字列にリセットされたためエラーが発生していないので NULL 文字列 ("") を含みます。未定義の変数を記述しようとすると、$ZERROR が設定され、CATCH ブロックにスローされます。この $ZERROR は <UNDEFINED>ZerrorMain+4^zerrortest *fred を含みます。ここにはエラーの名前、位置、およびこの種類のエラーに固有の詳細情報が指定されていますこの場合、追加情報は未定義のローカル変数 fred の名前になります。アスタリスクの接頭語は、ローカル変数であることを示しています。(Caché エラー名は山括弧で囲まれ、この例は Web ブラウザから実行されるため、この例では、$ZCVT($ZERROR,"O","HTML") が使用されます)。
entryref は以下のように表示されます。
ZerrorMain+4^zerrortest -- 4 line offset from label ZerrorMain in program zerrortest
ZerrorMain^zerrortest -- no offset from label ZerrorMain in program zerrortest; error occurred in the label line
+3^zerrortest -- 3 line offset from beginning of program zerrortest; no label precedes the error line
$ZERROR 値の最大長は 512 文字です。その長さを超える値は、512 文字に切り捨てられます。
AsSystemError() メソッド
%Exception.SystemExceptionOpens in a new tab クラスの AsSystemError()Opens in a new tab メソッドは、$ZERROR と同じ値を返します。詳細は、以下の例を参照してください。
TRY {
KILL mylocal
WRITE mylocal
}
CATCH myerr {
WRITE "AsSystemError is: ",myerr.AsSystemError(),!
WRITE "$ZERROR is: ",$ZERROR
}
AsSystemError() は、TRY/CATCH の例外処理ブロック構造内の $ZERROR よりも優れています。$ZERROR は、例外処理中に発生するエラーによって上書きされる場合があるためです。
一部のエラーに関する追加情報
特定の種類のエラーが発生した場合、$ZERROR は以下の形式でエラーを返します。
<ERRORCODE>entryref info
info コンポーネントには、エラーの原因に関する追加情報が含まれます。以下に示すテーブルは、追加情報が格納されるエラーと、その情報の形式の一覧です。エラー・コードは、1 個のスペース文字で info コンポーネントから区切られます。
エラー・コード | 情報コンポーネント |
---|---|
<UNDEFINED> |
未定義の変数の名前 (添え字が使用されている場合は添え字も含む)。これは、ローカル変数、プロセス・プライベート・グローバル、グローバル、または多次元クラス・プロパティのいずれかです。ローカル変数名の先頭にはアスタリスクが付いています。多次元プロパティの名前はピリオドから始まり、ローカルの変数名と区別されます。 %SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定することで、未定義の変数を参照する際に <UNDEFINED> エラーを生成しないように Caché の動作を変更できます。 |
<SUBSCRIPT> |
エラー内の添え字参照。エラーを生成した行参照 (ルーチンと行オフセット)、添え字付き変数、およびエラーの添え字レベル。構造化システム変数 (SSVN) の場合、行参照 (ルーチンと行オフセット) のみが指定されます。 %SYSTEM.Process.NullSubscripts()Opens in a new tab メソッドを設定することで、NULL 文字列の添え字を含むグローバル変数を参照する際に <SUBSCRIPT> エラーを生成しないように既定の動作を変更できます。NULL 文字列の添え字は、ローカル変数では許可されません。 |
<NOROUTINE> | アスタリスクを接頭語とした、参照されるルーチン名 |
<CLASS DOES NOT EXIST> | アスタリスクを接頭語とした、参照されるクラス名 |
<PROPERTY DOES NOT EXIST> | アスタリスクを接頭語とした、参照されるプロパティの名前と、それに続くコンマ区切り文字とそのプロパティが存在することになっているクラス名 |
<METHOD DOES NOT EXIST> | アスタリスクを接頭語とした、呼び出されるメソッドの名前と、それに続くコンマ区切り文字とそのメソッドが存在することになっているクラス名 |
<PROTECT> | 参照されるグローバルの名前と、そのグローバルが格納されているディレクトリの名前 (コンマ区切り) |
<THROW> | アスタリスク接頭語、オブジェクト名の後に DisplayString() メソッドによって返された値が続きます。 |
<COMMAND> |
トランザクションをしていないときに TCOMMIT を呼び出すと、info コンポーネントは *NoTransaction になります。 値を返さないユーザ定義関数を呼び出すと、info コンポーネントは、値を返したコマンドの位置を含むメッセージになります。 |
<DIRECTORY> | 先頭にアスタリスクの付いた、無効なディレクトリのフル・パス名。 |
<FRAMESTACK> | <FRAMESTACK> エラーでプロセスが終了すると、<FRAMESTACK> エラーと追加情報がメッセージとして mgr/cconsole.log に書き込まれます。情報メッセージには、終了したプロセスのプロセス ID (pid) と、エラーを生成した行参照 (ルーチンと行オフセット) が示されます。例 : (pid) 0 <FRAMESTACK> at +13^|"USER"|test |
ルーチン (またはメソッド) のローカル変数名、および未定義のルーチン名、クラス名、プロパティ名、およびメソッド名の先頭にはアスタリスク (*) が付いています。プロセス・プライベート・グローバルは、接頭語 ^|| によって識別されます。グローバル変数は、接頭語 ^ (キャレット) によって識別されます。クラス名は、% の接頭語で表されます。
以下の例は、エラーの原因を指定する追加エラー情報を示しています。いずれの場合でも、指定された項目が存在しません。生成されたエラーの info コンポーネントは空白スペースでエラー名と区切られていることに注意してください。アスタリスク (*) はローカルの変数、クラス、プロパティ、またはメソッドを示します。キャレット文字 (^) はグローバルを示し、^|| はプロセス・プライベート・グローバルを示します。
<UNDEFINED> エラーの例
UndefTest ; ZNSPACE "SAMPLES" KILL x,abc(2) KILL ^xyz(1,1),^|"USER"|xyz(1,2) KILL ^||ppg(1),^||ppg(2) TRY {WRITE x } // undefined local variable CATCH {WRITE $ZERROR,! } TRY {WRITE abc(2)} // undefined subscripted local variable CATCH {WRITE $ZERROR,! } TRY {WRITE ^xyz(1,1) } // undefined global CATCH {WRITE $ZERROR,! } TRY {WRITE ^|"USER"|xyz(1,2) } // undefined global in another namespace CATCH {WRITE $ZERROR,! } TRY {WRITE ^||ppg(1) } // undefined process-private global CATCH {WRITE $ZERROR,! } TRY {WRITE ^|"^"|ppg(2) } // undefined process-private global CATCH {WRITE $ZERROR,! } <UNDEFINED>UndefTest+5^MyProg *x <UNDEFINED>UndefTest+7^MyProg *abc(2) <UNDEFINED>UndefTest+9^MyProg ^xyz(1,1) <UNDEFINED>UndefTest+11^MyProg ^xyz(1,2) <UNDEFINED>UndefTest+13^MyProg ^||ppg(1) <UNDEFINED>UndefTest+15^MyProg ^||ppg(2)
<SUBSCRIPT> エラーの例
SubscriptTest ; DO $SYSTEM.Process.NullSubscripts(0) KILL abc,xyz TRY {SET abc(1,2,3,"")=123 } CATCH {WRITE $ZERROR,! } TRY {SET xyz(1,$JUSTIFY(1,1000))=1} CATCH {WRITE $ZERROR,! } <SUBSCRIPT>SubscriptTest+3^MyProg *abc() Subscript 4 is "" <SUBSCRIPT>SubscriptTest+5^MyProg *xyz() Subscript 2 > 511 chars
<NOROUTINE> エラーの例
NoRoutineTest ; KILL ^NotThere TRY {DO ^NotThere } CATCH {WRITE $ZERROR,! } TRY {JOB ^NotThere } CATCH {WRITE $ZERROR,! } TRY {GOTO ^NotThere } CATCH {WRITE $ZERROR,! } <NOROUTINE>NoRoutineTest+2^MyProg *NotThere <NOROUTINE>NoRoutineTest+4^MyProg *NotThere <NOROUTINE>NoRoutineTest+6^MyProg *NotThere
オブジェクト・エラーの例
WRITE $SYSTEM.XXQL.MyMethod() <CLASS DOES NOT EXIST> *%SYSTEM.XXQL DO $SYSTEM.SQL.MyMethod() <METHOD DOES NOT EXIST> *MyMethod,%SYSTEM.SQL SET x=##class(%SQL.Statement).%New() WRITE x.MyProp <PROPERTY DOES NOT EXIST> *MyProp,%SQL.Statement
<PROTECT> エラーの例 (Windows 上) :
// user does not have access privileges for %SYS namespace SET x=^|"%SYS"|var <PROTECT> ^var,c:\intersystems\cache\mgr\
ユーザ定義関数の呼び出し時における <COMMAND> エラーの例。この例では、MyFunc QUIT コマンドは値を返しません。これにより、$$MyFunc の呼び出しの位置を示す entryref、および QUIT コマンドの位置を示す info メッセージを含む <COMMAND> エラーが生成されます。
Main
TRY {
KILL x
SET x=$$MyFunc(7,10)
WRITE "returned value is ",x,!
RETURN
}
CATCH { WRITE "$ZERROR = ",$ZCVT($ZERROR,"O","HTML"),!
}
MyFunc(a,b)
SET c=a+b
QUIT
関数を PUBLIC キーワードでプロシージャとして呼び出した際の同じ <COMMAND> エラー。
Main
TRY {
KILL x
SET x=$$MyFunc(7,10)
WRITE "returned value is ",x,!
RETURN
}
CATCH { WRITE "$ZERROR = ",$ZCVT($ZERROR,"O","HTML"),!
}
MyFunc(a,b) PUBLIC {
SET c=a+b
QUIT }
<DIRECTORY> エラーの例 (Windows 上) :
TRY { SET prev=$SYSTEM.Process.CurrentDirectory("bogusdir")
WRITE "previous directory: ",prev,!
RETURN }
CATCH { WRITE "$ZERROR = ",$ZCVT($ZERROR,"O","HTML"),!
QUIT }
5.1 以前のエラー処理コード
info コンポーネントを Caché 5.1 および以降のリリースのこれらのエラー・コードに追加した結果、$ZERROR 内の文字列形式に関する前提条件を含んでいた 5.1 より前のエラー処理ルーチンは、以前と同じように機能させるための再設計が必要になる場合があります。例えば、以下に示すコマンドはバージョン 5.1 では動作しません。
WRITE "Error line: ", $PIECE($ZERROR, ">", 2)
以下のように変更する必要があります。
WRITE "Error line: ", $PIECE($PIECE($ZERROR, ">", 2), " ", 1)
メモ
ZLOAD とエラー・メッセージ
以下の ZLOAD 操作では、ルーチン・バッファにロードされたルーチン名が後続のエラー・メッセージの entryref の部分に表示されます。この表示は、処理の間中、または ZREMOVE を使用して削除されるまで、あるいは別の ZLOAD によって削除されるか置き換えられるまで続きます。以下の例は、このルーチン・バッファの内容を表示する方法を示します。
SAMPLES>ZLOAD Sample.Person.1
SAMPLES>WRITE 6/0
<DIVIDE>^Sample.Person.1
SAMPLES>WRITE fred
<UNDEFINED>^Sample.Person.1 *fred
SAMPLES>WRITE ^fred
<UNDEFINED>^Sample.Person.1 ^fred
SAMPLES>ZNAME "USER"
USER>WRITE 7/0
<DIVIDE>^Sample.Person.1
USER>ZREMOVE
USER>WRITE ^fred
<UNDEFINED> ^fred
$ZERROR とプログラム・スタック
$ZERROR 文字列の <error> 部分には、最新のエラー・メッセージが含まれます。$ZERROR 文字列の entryref 部分のコンテンツは、最新エラーのスタック・レベルを反映します。以下のターミナル・セッションは、無意味なコマンド GOBBLEDEGOOK の呼び出しを試みますが、これは <SYNTAX> エラーという結果になります。また、上記で指定された ZerrorMain も実行しますが、$ZERROR 値 <UNDEFINED> という結果になります。このターミナル・セッション中の次に続く $ZERROR 値は、以下のようにこのプログラムの呼び出しを反映します。
SAMPLES>gobbledegook
SAMPLES>WRITE $ZERROR
<SYNTAX>
SAMPLES>DO ^zerrortest
SAMPLES>WRITE $ZERROR
<UNDEFINED>ZerrorMain+2^zerrortest *FRED
SAMPLES 2d0>gobbledegook
SAMPLES 2d0>WRITE $ZERROR
<SYNTAX>^zerrortest
SAMPLES 2d0>QUIT
SAMPLES>WRITE $ZERROR
<SYNTAX>^zerrortest
SAMPLES>gobbledegook
SAMPLES>WRITE $ZERROR
<SYNTAX>
$ZTRAP が設定されているときの $ZERROR
エラーが発生して $ZTRAP が設定されていると、Caché に $ZERROR のエラー・メッセージが帰り、$ZTRAP で指定したエラー・トラップ・ハンドラに分岐します (発生する可能性があるエラーのリストは、"Caché エラー・リファレンス" の "システム・エラー・メッセージ" を参照してください)。
$ZERROR の設定
Caché モードのみで、SET コマンドを使用して $ZERROR を 512 文字までの値に設定することができます。512 文字よりも長い値は 512 に切り捨てられます。
エラー処理の後に、$ZERROR を NULL 文字列 ("") にリセットすることを強くお勧めします。