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 <error_message_string> [ <value> ] [ debugBreak:<boolean> ]
throw()
介入する catch がスクリプト内にない場合は、引数にエラー メッセージを指定して throw()
を呼び出すと、ランタイム エラーが表示され、MAXScript の標準エラー レポート機能によってエラー メッセージがレポートされます。
オプションの <value>
引数には、エラー メッセージで出力する任意の値(通常はエラーに関連するオブジェクト)を指定できます。throw
が catch()
本体内にある場合、この引数は指定できません。指定するとコンパイル エラーが生成されます。
オプションの 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()
を使用するなどの方法で、複数のスクリプトからコードを実行する場合に便利です。
undefined
を返します。<integer> getErrorSourceFileLine()
3ds Max 2018 以降で使用可能: catch ステートメント内で呼び出された場合は、エラーが発生した行番号を返します。
undefined
を返します。<integer> getErrorSourceFileOffset()
3ds Max 2018 以降で使用可能: catch ステートメント内で呼び出された場合は、エラーが発生したオフセットを返します。コメントを含む評価中の式は、ここまでです。
undefined
を返します。