info コンポーネントには、エラーの原因に関する追加情報が含まれます。以下に示すテーブルは、追加情報が格納されるエラーと、その情報の形式の一覧です。エラー・コードは、1 個のスペース文字で info コンポーネントから区切られます。
エラー・コード |
情報コンポーネント |
<UNDEFINED> |
未定義の変数の名前 (添え字が使用されている場合は添え字も含む)。これは、ローカル変数、プロセス・プライベート・グローバル、グローバル、または多次元クラス・プロパティのいずれかです。ローカル変数名の先頭にはアスタリスクが付いています。多次元プロパティの名前はピリオドから始まり、ローカルの変数名と区別されます。
%SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定することで、未定義の変数を参照する際に <UNDEFINED> エラーを生成しないように InterSystems IRIS の動作を変更できます。 |
<SUBSCRIPT> |
エラー内の添え字参照。エラーを生成した行参照 (ルーチンと行オフセット)、添え字付き変数、およびエラーの添え字レベル。構造化システム変数 (SSVN) の場合、行参照 (ルーチンと行オフセット) のみが指定されます。
%SYSTEM.Process.NullSubscripts()Opens in a new tab メソッドを設定することで、NULL 文字列の添え字を含むグローバル変数を参照する際に <SUBSCRIPT> エラーを生成しないように InterSystems IRIS の動作を変更できます。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/messages.log に書き込まれます。情報メッセージには、終了したプロセスのプロセス ID (pid) と、エラーを生成した行参照 (ルーチンと行オフセット) が示されます。例 : (pid) 0 <FRAMESTACK> at +13^|"USER"|test |
ルーチン (またはメソッド) のローカル変数名、および未定義のルーチン名、クラス名、プロパティ名、およびメソッド名の先頭にはアスタリスク (*) が付いています。プロセス・プライベート・グローバルは、接頭語 ^|| によって識別されます。グローバル変数は、接頭語 ^ (キャレット) によって識別されます。クラス名は、% の接頭語で表されます。
以下の例は、エラーの原因を指定する追加エラー情報を示しています。いずれの場合でも、指定された項目が存在しません。生成されたエラーの info コンポーネントは空白スペースでエラー名と区切られていることに注意してください。アスタリスク (*) はローカルの変数、クラス、プロパティ、またはメソッドを示します。キャレット文字 (^) はグローバルを示し、^|| はプロセス・プライベート・グローバルを示します。
<UNDEFINED> エラーの例
UndefTest ;
SET $NAMESPACE="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\iris\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 }
メモ
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 値は、以下のようにこのプログラムの呼び出しを反映します。
USER>gobbledegook
USER>WRITE $ZERROR
<SYNTAX>
USER>DO ^zerrortest
USER>WRITE $ZERROR
<UNDEFINED>ZerrorMain+2^zerrortest *FRED
USER 2d0>gobbledegook
USER 2d0>WRITE $ZERROR
<SYNTAX>^zerrortest
USER 2d0>QUIT
USER>WRITE $ZERROR
<SYNTAX>^zerrortest
USER>gobbledegook
USER>WRITE $ZERROR
<SYNTAX>
$ZTRAP が設定されているときの $ZERROR
エラーが発生し、$ZTRAP が設定されている場合、InterSystems IRIS は $ZERROR でエラー・メッセージを返し、$ZTRAP で指定したエラー・トラップ・ハンドラに分岐します (返される可能性があるエラー・テキストのリストは、"InterSystems IRIS エラー・リファレンス" の "システム・エラー・メッセージ" を参照してください)。
$ZERROR の設定
InterSystems IRIS モードのみで、SET コマンドを使用して $ZERROR を 512 文字までの値に設定することができます。512 文字よりも長い値は 512 に切り捨てられます。
エラーの処理に続いて、$ZERROR を NULL 文字列 ("") にリセットすることを強くお勧めします。
関連項目