try (マクロ)
パッケージ: CURL.LANGUAGE.COMPILER

シグネチャ

{try body [catch e1:type1 do catch-body1] [catch e2:type2 do catch-body2] [finally finally-body] }

Exception のキャッチを許可し、body を評価します。

説明

try 式は、本体、0 個以上の catch 句、およびオプションの finally 句で構成されます。本体は、完了するか、Exception がスローされるまで実行されます。catch 句には、Exception 型を指定する正式パラメータ宣言があります。本体が完了する前に本体外に Exception がスローされると、catch 句が順番に検討され、スローされた値と互換性のある変数型を持った (isa により判定) 最初の catch 句が、その変数をキャッチされた値に設定して実行されます。各 catch 句変数の型は、Exception のサブタイプでなくてはならず、以前の catch 句変数のサブタイプであってはなりません。
finally 句が存在する場合は、常に本体または catch ボディの後で実行されます。本体が正常に終了したかどうかには関係ありません。
API バージョン 4.0 より、try ステートメントは、その本体と catch 句の本体に基づく値を生成します。ただし、finally の本体は含まれません。switch のみがある場合は、body の最後のステートメントとcatch-body が、値を生成するか、例外をスローするか、または戻り値を返すいずれかの場合にのみ値を生成します。body が例外をキャッチすることなく実行した場合、最終ステートメントが値を生成します。例外がキャッチされた場合には、catch 句本体の最終ステートメントが値を生成します。
catch 句または finally 句そのものが Exception をスローする場合、現在の try 式は終了します。このような Exception は、外側にネストされた try 式によりキャッチすることができます。
API バージョン 4.0 より、returnbreak、および continue ステートメントは、try 式の外部に制御を移すために使用することができます。ただし、finally ブロックの外部に制御を移すことはできません。finally ブロックの実行が終了すると直ちに例外がスローされる可能性があるためです。


{value
    {let results:VBox = {VBox "computing ..."}}
    
    {results.add
        {try
            {results.add "step 1 ..."}
            {error "children playing"}
            "step 2 ..."
         catch th:Exception do 
            {format "warning: %s", th.value}               
         finally
            {results.add "done."}
        }
    }

    results
}