Try 式

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

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

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

   

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

try <protected_expr> catch <on_err_expr> 

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

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

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

これは、非常に単純なエラー トラップ手法なので、エラー コードや発生したエラーに関する情報などは取得できません。

例:

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> ] throw() 

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

2 つ目のオプションの引数は、エラー メッセージで出力する任意の値(おそらくエラーに関連するオブジェクト)です。

throw catch() 本体にある場合、この 2 番目の引数は指定できません。指定するとコンパイル エラーが生成されます。

   

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 ***