%Status 値の操作
多くの InterSystems クラスは %StatusOpens in a new tab データ型クラスを使用してステータス情報を表し、そのメソッドは成功またはエラーを表す %StatusOpens in a new tab 値 (ステータス) を返します。ステータスが 1 つのエラー (または複数のエラー) を表す場合、ステータス値にはエラーに関する情報も含まれます。
独自のステータス値を返すこともできます。
この記事では、ステータス値とその値を操作する方法について説明します。
ステータス値の操作の基本
前述したように、多くの InterSystems クラスのメソッドは、成功またはエラーを示すステータスを返します。例えば、%Library.PersistentOpens in a new tab の %Save() メソッドはステータスを返します。このようなメソッドの場合は、必ず戻り値を取得してください。その後、ステータスを確認してから、適宜続けます。基本的なツールは以下のとおりです。
-
ステータスが成功またはエラーのどちらを示すかを確認するには、次のいずれかを使用します。
-
$$$ISOK および $$$ISERR マクロ。これらはインクルード・ファイル %occStatus.inc で定義されています。このインクルード・ファイルは、すべてのオブジェクト・クラスで自動的に利用可能です。
-
$SYSTEM.Status.IsOK() および $SYSTEM.Status.IsError() メソッド。これらはターミナル (マクロを使用できない場所) で特に便利です。
-
-
エラーの詳細を表示するには、$SYSTEM.OBJ.DisplayError() または $SYSTEM.Status.DisplayError() を使用します。 これらのメソッドは互いに同等です。現在のデバイスに出力を書き込みます。
-
エラーの詳細を含む文字列を取得するには、$SYSTEM.Status.GetErrorText() を使用します。
例
以下に例を示します。
Set object=##class(Sample.Person).%New()
Set object.Name="Smith,Janie"
Set tSC=object.%Save()
If $$$ISERR(tSC) {
Do $SYSTEM.OBJ.DisplayError(tSC)
Quit
}
以下は、$SYSTEM.Status.GetErrorText() の一部の使用例を示しています。
If $$$ISERR(tSC) {
// if error, log error message so users can see them
Do ..LogMsg($System.Status.GetErrorText(tSC))
}
ステータス値で報告される複数のエラー
ステータス値が複数のエラーを表している場合は、この手法では最新の情報のみが表示されます。ステータス値によって表されるすべてのエラーに関する情報を取得するには、$SYSTEM.Status.DecomposeStatus() を使用します。これは、エラーの詳細の配列を (参照で、2 番目の引数として) 返します。以下に例を示します。
Do $SYSTEM.Status.DecomposeStatus(tSC,.errorlist)
//then examine the errorlist variable
変数 errorlist は、エラー情報を含む配列です。次に、一部の例を示します (この例では、読みやすいように改行がされています)。
ZWRITE errorlist
errorlist=2
errorlist(1)="ERROR #5659: Property 'Sample.Person::SSN(1@Sample.Person,ID=)' required"
errorlist(1,"caller")="%ValidateObject+9^Sample.Person.1"
errorlist(1,"code")=5659
errorlist(1,"dcode")=5659
errorlist(1,"domain")="%ObjectErrors"
errorlist(1,"namespace")="SAMPLES"
errorlist(1,"param")=1
errorlist(1,"param",1)="Sample.Person::SSN(1@Sample.Person,ID=)"
...
errorlist(2)="ERROR #7209: Datatype value '' does not match
PATTERN '3N1""-""2N1""-""4N'"_$c(13,10)_" >
ERROR #5802: Datatype validation failed on property 'Sample.Person:SSN',
with value equal to """""
errorlist(2,"caller")="zSSNIsValid+1^Sample.Person.1"
errorlist(2,"code")=7209
...
各エラー・メッセージをログに記録した場合は、前のロギングの例を次のように適合させることができます。
If $$$ISERR(tSC) {
// if error, log error message so users can see them
Do $SYSTEM.Status.DecomposeStatus(tSC,.errorlist)
For i=1:1:errorlist {
Do ..LogMsg(errorlist(i))
}
}
ステータス値を返す
独自のカスタム・ステータス値を返すこともできます。ステータス値を作成するには、以下の構文を使用します。
$$$ERROR($$$GeneralError,"your error text here")
または以下も同等の構文です。
$SYSTEM.Status.Error($$$GeneralError,"your error text here")
以下に例を示します。
quit $SYSTEM.Status.Error($$$GeneralError,"Not enough information for request")
追加のエラーに関する情報を含めるには、$SYSTEM.Status.AppendStatus() を使用してステータス値を変更します。以下に例を示します。
set tSC=$SYSTEM.Status.AppendStatus(tSCfirst,tSCsecond)
quit tSC
詳細情報
詳細は、%SYSTEM.StatusOpens in a new tab クラスおよび %Library.StatusOpens in a new tab クラスのクラス参照を参照してください。