Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

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 を拡張して、独自の例外クラスを作成することも可能です。

ループ構造と同じように、QuitReturn も、Try または Catch のコード・ブロック内で使用した場合、異なる動作をします。

  • QuitTry/Catch を終了するだけです。

  • ReturnTry/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>
FeedbackOpens in a new tab