エラーハンドリング
スクリプトの実行中にエラーが発生することがあります。これらは一般的に ランタイムエラー と呼ばれます。これは、スクリプトが実行中に発生するためで、スクリプトが実行される前に検出される 構文エラー とは対照的です。ランタイムエラーが発生すると、それは 例外をスローします 。例外がキャッチされないと、スクリプトの実行が終了し、エラーメッセージが表示されます。 try...catch...end try
制御構造を使用すると、これらの例外をキャッチして、スクリプトがエラー条件をあなたが選択した方法で処理 することができます。 throw
コマンドを使用して自分自身の例外をスローしたり、キャッチした例外を再スローすることができます。
Try ... Catch ... End Try
ステートメント
動作: try
ステートメントは、ステートメントのブロックが実行中にスローされる可能性のある任意の例外によって終了されることから保護します。
もし例外がスローされると、コントロールはすぐに catch
ステートメントに続く最初のステートメントに移ります。例外がスローされない場合、catchブロックはスキップされ、end try
に続く次のステートメントの実行が続きます。
構文:
try
statementsToTry
{
catch {exceptionVariable}
statementsToHandleErrors
}
end [try | catch]try {to} singleStatementToTry
例:
try
doSomething
throw "Bad Problem", "Something went wrong"
doSomethingElse -- これは実行されません
catch anException
//ここでエラー処理を行います
put anException -- "Bad Problem"を表示
put anException.reason -- "Something went wrong"を表示
end try
この例では、try
ブロック内の throw
コマンドが例外をスローします。これにより、実行フローが中断され、catch
ステートメントの直後の最初の文にすぐに制御が移ります。スローされた例外(ここで説明されているように 例外オブジェクトの形式で)は、anException
変数に代入されます。
基本的に、try
部分でスローされる例外は、スクリプトのcatch
部分へ直接実行を移行させます。例外が発生しない場合、catch部分はスキップされます。例外はSenseTalk自体によってスローされることがあります - 例えば、"doSomething"ハンドラがない場合、未知のコマンド例外がスローされます - または、表示されているようにあなたのスクリプトによって直接スローされます。例外が発生したハンドラでキャッチされない場合、それは最初のものを呼び出した別のハンドラでキャッチすることができます。例えば、doSomethingハンドラで例外がスローされ、そこでキャッチされない場合、それはここで、testExceptionsハンドラでキャッチされます。
catch
行の_exceptionVariable_名(例ではanException)はオプションです。提供された場合、それは例外の名前をテキスト値として持つ例外オブジェクトを受け取ります。例外オブジェクトのname
プロパティにもスローされた例外の名前が含まれています(例では"Bad Problem")、そしてreason
プロパティは通常、例外の理由をより詳細に説明しています(例では"Something went wrong")。キャッチした例外はthe exception
グローバルプロパティでも利用可能です。グローバルプロパティforオブジェクトメッセージと結果のthe exception
グローバルプロパティの説明を参照してください。
try
ステートメントの単一ステートメントバージョンは、例外をス ローした場合でもスクリプトを終了させずに単一のコマンドを実行する簡単な方法を提供します。例外がスローされると、次のステートメントで通常通り実行が続行されます。例外はthe exception
グローバルプロパティで利用でき、それ以外の場合は空に設定されます。
catch
部分が省略されると、tryブロック内でスローされた例外はスクリプトの流れを中断し、そのtryブロック内の残りのステートメントの実行を防ぎますが、それ以外では無視され、tryブロックの次のステートメントで実行が続行されます。
例:
try
doThingsHere
catch except
if except.name is "Unknown Property or Function" then
add 1 to global unknownCallCounter
else
throw except // re-throw any other exception
end if
end try
try
ステートメントのシングルラインバージョンは、例外がスローされた場合でもスクリプトが終了しないで単一のコマンドを実行する簡単な方法を提供します。例外がスローされた場合でも、実行は通常通り次のステートメントに進みます。例外は、それ以外は空に設定されている the exception
グローバルプロパティ で利用できます。
例:
set amt to "plenty"
try to set product to 5 * amt -- throws an exception because amt is not a number
if the exception is not empty then put the exception
Throw
コマンド
振る舞い: 例外をスローし、例外がキャッチされない限り、エラーメッセージと共にスクリプトの実行を終了させます。throw
コマンドで理由を指定することができ、それを第二パラメータとして提供するか、または名前と理由のプロパティを持つプロパティリストを代わりに使用することができます。
構文:
throw {exception} exceptionName {, exceptionReason {, additionalReason ...}}
throw {exception} exceptionObject
exceptionObject
が与えられると、通常は少なくともnameプロパティ、そして通常はreasonプロパティを持つべきです。上の例で示されています。どのような場合でも、throw
コマンドは、提供された情報に加えて、いくつかの追加の詳細を使用して、完全な例外オブジェクトが作成され、スローされることを確認します。
例:
throw "BadProblem","Something is seriously messed up!"
throw (name: "Error Code 97", reason:"Invalid Phone Number")
廃止された関数
exceptionName
、exceptionReason
、exceptionLocation
関数は、catchブロック内でキャッチされた例外の名前、理由、場所を返します。しかし、これらは現在では廃止されており、その使用は推奨されません。代わりにthe exception
グローバルプロパティを使用してください。
TryDepth
関数
動作: この関数は、スクリプトの現在の実行点で有効なtrymd ブロックのネストレベルを返します。
これは、スローされた例外がコールスタックのより高いレベルでキャッチされるかどうかを迅速に判断するために使用することができます。戻り値がゼロは、現在tryブロックがないことを示しているので、スローされた例外はスクリプトの実行を終了させます。
構文:
tryDepth()
the tryDepth
例:
try
put the tryDepth -- 1
catch
put the tryDepth -- 0 (outside of the 'try' portion)
end try