Try/Catch 文と Throw コマンド
Try/Catch 文では、コード・ブロック (Try 内) の実行時エラーの発生を監視できます。エラーが発生した場合、システムは例外を生成して実行を別のコード・ブロック (Catch 内) に移し、そこでエラーを処理できます。Catch には引数があります。これは例外に関する情報 (名前、コード、場所、および例外に関連する追加データ) が含まれた例外オブジェクトです。Try/Catch 文内の Throw では、明示的に例外を生成できます。
例外のクラスは %Exception パッケージに属します。例えば、システム例外の場合は %Exception.SystemExceptionOpens in a new tab クラス、単純なカスタム例外の場合は %Exception.GeneralException クラスになります。%Exception.AbstractExceptionOpens in a new tab を拡張して、独自の例外クラスを作成することも可能です。
ループ構造と同じように、Quit と Return も、Try または Catch のコード・ブロック内で使用した場合、異なる動作をします。
-
Quit は Try/Catch を終了するだけです。
-
Return は Try/Catch を終了し、さらに現在のクラス・メソッド、プロシージャ、またはルーチンも終了します。
VS Code - ObjectScript
/// examples for ObjectScript Tutorial
Class ObjectScript.Examples
{
/// examples of system and custom exceptions
ClassMethod Exceptions(x as %Numeric)
{
// UNDEFINED error throws a system exception
try {
write "Hello!", !, xyz
}
catch err {
write !, "Error name: ", ?20, err.Name,
!, "Error code: ", ?20, err.Code,
!, "Error location: ", ?20, err.Location,
!, "Additional data: ", ?20, err.Data, !
}
// DIVIDE error throws a system exception
try {
write 1/0
}
catch err {
write !, "Error name: ", ?20, err.Name,
!, "Error code: ", ?20, err.Code,
!, "Error location: ", ?20, err.Location,
!, "Additional data: ", ?20, err.Data, !
}
// create a simple custom exception object and throw it
set ex = ##class(%Exception.General).%New()
set ex.Name = "Demo Exception",
ex.Code = 100000,
ex.Data = "Tutorial Example"
try {
write !, "Hello!", !
if (x >= 5) throw ex // throw the exception
}
catch err {
write !, "Error name: ", ?20, err.Name,
!, "Error code: ", ?20, err.Code,
!, "Error location: ", ?20, err.Location,
!, "Additional data: ", ?20, err.Data, !
if (x = 5) return // terminate method
}
write !, "Finished!"
}
}
このテストでは、Return をトリガするために Exceptions() の呼び出しに 5 を渡しているため、コードの最終行 write !, "Finished!" はスキップされます。
ターミナルを使用したテスト
USER>do ##class(ObjectScript.Examples).Exceptions(5)
Hello!
Error name: <UNDEFINED>
Error code: 9
Error location: zExceptions+3^ObjectScript.Examples.1
Additional data: xyz
Error name: <DIVIDE>
Error code: 18
Error location: zExceptions+13^ObjectScript.Examples.1
Additional data:
Hello!
Error name: Demo Exception
Error code: 100000
Error location:
Additional data: Tutorial Example
USER>