Try 式

MAXScript には C++ 例外処理手順を単純化した try 式があり、例外処理を簡単に行えます。

try 式を使用してコードの一部をカッコで囲み、コード内のランタイム エラーを見つけることができます。

これにより、MAXScript がスクリプトの実行を中止してエラー メッセージを出力する代わりに、適切に応答したり、正しい操作を実行することができます。

try 式の構文は次のとおりです。

try <protected_expr> catch <on_err_expr>

<protected_expr> が実行され、発生したエラーがトラップされて <on_err_expr> が実行されます。

<protected_expr> がブロック式である場合、このブロック式によってエラーの発生位置で実行が中止されます。

保護された式にエラーがない場合、<on_err_expr> は実行されません。

これは、非常に単純なエラー トラップ手法なので、エラー コードや発生したエラーに関する情報が制限されるだけです。以下の getCurrentException() を参照してください。

例:

    f = openFile "foo.dat"
    try
    while not eof f do read_some_data f
    catch
    (
    messageBox "bad data in foo.dat"
    results = undefined
    )
    close f

この例では、read_some_data() 関数のデータの読み込みまたは処理中に発生したエラーがトラップされます。その後、メッセージ ボックスが表示され、クリーンアップが行われます。

これは、単純なエラートラップ機能を使った良い例です。

Throw

関連する throw() 関数は、一時的なクリーンアップを行う場合に、独自のランタイム エラーを生成して捕らえたエラーを渡したり、非ローカル ジャンプを行うのに使えます。

throw() の形式は以下のとおりです。

throw <error_message_string> [ <value> ] [ debugBreak:<boolean> ]
throw()

介入する catch がスクリプト内にない場合は、引数にエラー メッセージを指定して throw() を呼び出すと、ランタイム エラーが表示され、MAXScript の標準エラー レポート機能によってエラー メッセージがレポートされます。

オプションの <value> 引数には、エラー メッセージで出力する任意の値(通常はエラーに関連するオブジェクト)を指定できます。throwcatch() 本体内にある場合、この引数は指定できません。指定するとコンパイル エラーが生成されます。

オプションの debugBreak:<boolean> 引数は、中断して[MAXScript デバッガ](MAXScript Debugger)ウィンドウを表示するかどうかを指定します。この引数の既定の設定は、[MAXScript デバッガ](MAXScript Debugger)環境設定の[既定のスロー デバッグ ブレーク : オン](Default Throw debugBreak:on)で設定されます。この設定を照会するには、MXSDebugger.defaultBreakOnThrow プロパティを使用します。これが true に設定されている場合でも、デバッガに対して[ブレーク命令を許可する](Allow Break On Throw)オプションが無効になっていれば、デバッガは表示されません。この設定を照会するには、MXSDebugger.allowBreakOnThrow プロパティを使用します。

try/catch が別の try 式内にある場合に throw() を呼び出すと、外部の try 式に関連付けられている catch 式が実行されます。

介入する catch がスクリプト内にない場合は、throw() を呼び出すと、MAXScript は try/catch を囲むカッコ内の先頭からスクリプトの実行を継続します。または、try/catch を囲むカッコがない場合は、現在実行中のスクリプトを中止します。

何らかの処理(クリーンアップ処理など)を施すためにエラーをキャッチし、外部ハンドラか MAXScript にエラーを渡してエラーをレポートするには、throw() を引数なし呼び出します。

これは、現在のエラーを送出するので、エラーのレポートは必ず catch 式の中で行わなければなりません。

例:

    try
    (
    i=10
    try ( i.x=1 ) -- will generate a run-time error
    catch
    (
    print "Bad Error" -- error message printed
    try (i.pos=[0,0,0]) -- will also generate a run-time error
    catch (throw()) -- throw() will cause outer catch
    -- to execute
    )
    )
    catch (print "Really Bad Error Occurred") -- error message printed

現在の例外

getCurrentException()

このメソッドでは、現在の例外のテキストが返されます。

キャッチ ステートメント内のみで役立ちます。キャッチ外で使用すると、「undefined」が返されます。

例:

    try
    (
    throw "AAAAA"
    )
    catch
    (
    format "*** % ***\n" (getCurrentException())
    )

結果:

    *** -- Runtime error: AAAAA ***
hasCurrentExceptionStackTrace()

3ds Max 2017 以降で使用可能: MAXScript スタック トレースを使用できる場合は true を返します。役に立つのはキャッチ ステートメント内のみです。キャッチ外で使用すると、false が返されます。キャッチ内では常に true が返されます。

hasCurrentExceptionCallStack()

3ds Max 2017 以降で使用可能: C++ スタック トレースを使用できる場合は true を返します。役に立つのはキャッチ ステートメント内のみです。キャッチ外で使用すると、false が返されます。キャッチ内で true となるのは、キャッチされた例外がアクセス違反や 0による整数の除算などのシステム例外であった場合のみです。

getCurrentExceptionStackTrace()

3ds Max 2017 以降で使用可能: MAXScript スタック トレースを文字列として返します。役に立つのはキャッチ ステートメント内のみです。キャッチ外で使用すると、false が返されます。キャッチ内では常に true が返されます。

getCurrentExceptionCallStack()

3ds Max 2017 以降で使用可能: 例外が発生したときにキャプチャされた C++ スタック トレースを文字列として返します。キャッチ ステートメント内のみで役立ちます。キャッチ外で使用すると、「undefined」が返されます。キャッチ内で C++ スタック トレースがキャプチャされなかった場合は、空の文字列が返されます。

CaptureCallStack [skipFirstNStackLevels:<int>]

3ds Max 2017 以降で使用可能: MAXScript コール スタックをキャプチャします。skipFirstNStackLevels パラメータが指定されていない場合、既定値は 3 です。

<string> getErrorSourceFileName()

3ds Max 2018 以降で使用可能: catch ステートメント内で呼び出されたときにエラーを引き起こすソース ファイルの名前を返します。これは、fileIn() を使用するなどの方法で、複数のスクリプトからコードを実行する場合に便利です。

注: このメソッドが役立つのは、catch ステートメント内のみです。catch ステートメントの外側で使用した場合は、undefined を返します。
<integer> getErrorSourceFileLine()

3ds Max 2018 以降で使用可能: catch ステートメント内で呼び出された場合は、エラーが発生した行番号を返します。

注: このメソッドが役立つのは、catch ステートメント内のみです。catch ステートメントの外側で使用した場合は、undefined を返します。
<integer> getErrorSourceFileOffset()

3ds Max 2018 以降で使用可能: catch ステートメント内で呼び出された場合は、エラーが発生したオフセットを返します。コメントを含む評価中の式は、ここまでです。

注: このメソッドが役立つのは、catch ステートメント内のみです。catch ステートメントの外側で使用した場合は、undefined を返します。