メインコンテンツまでスキップ
バージョン:23.3

エラーハンドリング

スクリプトの実行中にエラーが発生することがあります。これらは一般的に ランタイムエラー と呼ばれます。これは、スクリプトが実行中に発生するためで、スクリプトが実行される前に検出される 構文エラー とは対照的です。ランタイムエラーが発生すると、それは 例外をスローします 。例外がキャッチされないと、スクリプトの実行が終了し、エラーメッセージが表示されます。 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

Tech Talk

exceptionObjectが与えられると、通常は少なくともnameプロパティ、そして通常はreasonプロパティを持つべきです。上の例で示されています。どのような場合でも、throwコマンドは、提供された情報に加えて、いくつかの追加の詳細を使用して、完全な例外オブジェクトが作成され、スローされることを確認します。

例:

throw "BadProblem","Something is seriously messed up!"
throw (name: "Error Code 97", reason:"Invalid Phone Number")

廃止された関数

exceptionNameexceptionReasonexceptionLocation関数は、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