エラーハンドリング

スクリプトの実行中にエラーが起こる場合があります。これらは、スクリプトの実行前に検出される構文エラーに対し、スクリプトの実行中に起こることから、一般に実行時エラーと呼ばれます。実行時エラーが起こると、例外が投げられます。例外がキャッチされないと、スクリプトの実行は終了し、エラーメッセージが表示されます。try...catch...end try制御構造を使うと、こうした例外をキャッチできるため、ユーザーが選択した方法でスクリプトにエラー状態を処理させることができます。throwコマンドは、独自の例外を投げたり、キャッチした例外を投げ返したりする場合に使用できます。

try ... catch ... end try

振る舞い

try文により、文ブロックを保護して、実行中に投げられるかもしれない例外によって終了されないようにします。こうした例外が投げられると、制御によって直ちにcatch文の後に続く最初の文へと移ります。例外が投げられなければ、catchブロックはスキップされ、end tryの後に続く次の文から実行が継続します。

to testExceptions

try

doSomething

throw "Bad Problem", "Something went wrong"

doSomethingElse -- これは実行されません

catch anException

-- ここでエラーハンドリングの処理をします

put anException -- 「Bad Problem」を表示します

put anException.reason -- 「Something went wrong」を表示します

end try

-- 今度は1文のtryをテストします

try to set product to 5 * amt -- 例外を投げます

if the exception is not empty then put the exception

end testExceptions

技術トピック

構文: try

トライ対象の文

{

catch {例外変数}

エラーハンドリング用の文

}

end [try | catch]

try {to}トライ対象1文

基本的に、「try」部で例外が投げられると、実行はそのままスクリプトの「catch」部に移ります。例外が上がらなければ、catch部はスキップされます。例外はSenseTalk自体から投げられることもあります。例えば、「doSomething」ハンドラがない場合、Unknown Command例外が投げられます。または、throwコマンドを使ってスクリプトから直接投げることもできます。例外は、その発生場所のハンドラでキャッチされない場合、その最初のハンドラを呼び出した別のハンドラによってキャッチすることが可能です。例えば、例外がdoSomethingハンドラで投げられ、そこでキャッチされなかった場合は、このtestExceptionsハンドラでキャッチされます。
catch行の例外変数名(上記の例ではanException)は任意です。これを与えると、テキスト値が例外名となる例外オブジェクトを受け取ります。投げられた例外の名前は例外オブジェクトのnameプロパティにも格納されます(上記の例では「Bad Problem」)。そしてreasonプロパティでは、一般に例外原因の詳細な記述が行われます(上記の例では「Something went wrong」)。キャッチされた例外は、the exceptionグローバルプロパティでも利用することができます。the exceptionグローバルプロパティについての説明は、オブジェクトメッセージおよび結果用のグローバルプロパティをご覧ください。

catch部を省略した場合、tryブロックで投げられた例外は、スクリプトのフローを妨げ、そのtryブロック内の残りの文は実行されませんが、それ以外の点では無視され、tryブロックの後の次の文から実行が継続されます。

1文バージョンのtry文は、例外が投げられた場合もスクリプトを終了させることなく1つのコマンドを実行するための簡単な方法です。例外が投げられた場合、次の文から実行が正常に進行します。例外はthe exceptionグローバルプロパティで利用することができます。例外がなければこのプロパティはemptyに設定されています。

throw

振る舞い

例外を投げ、例外がキャッチされる場合を除き、エラーメッセージと共にスクリプトの実行を終了させます。throwコマンドには、reasonを与えることができます。これは、第2のパラメータとして与えます。もしくは、代わりにnameおよびreasonプロパティを備えたプロパティリストを使用しても構いません。

throw "BadProblem","Something is seriously messed up!"

throw (name: "Error Code 97", reason:"Invalid Phone Number")

技術トピック

構文: throw {exception} 例外名 {,例外原因 {,追加原因 ...}}

throw {exception} 例外オブジェクト

例外オブジェクトを与える場合は、一般に少なくともnameプロパティを設定し、上記の例にように通常はreasonプロパティも設定します。いずれの場合であれ、throwコマンドを使うと、ユーザが提供した情報にいくつかの追加詳細を加えて完全な例外オブジェクトを作成し、確実に投げさせることができます。

非推奨の関数

exceptionName()exceptionReason()およびexceptionLocation()関数は、catchブロック内で、キャッチされた例外の名前、原因および位置を返す関数ですが、 現在は廃止されているため、使用は推奨されません。代わりにthe exceptionグローバルプロパティを使用してください。

tryDepth関数

振る舞い

スクリプト実行において現時点で作用しているtryブロックのネストレベルを返す関数です。投げられた例外が呼び出しスタックの上位のどこかでキャッチされるか否かを素早く判断する材料になります。戻り値がゼロの場合、現状tryブロックがないことを示します。したがって、例外が投げられるとスクリプトの実行は終了します。

try

put the tryDepth -- 1

catch

put the tryDepth -- 0(「try」部の外側)

end try

技術トピック

構文: tryDepth()

the tryDepth

 

This topic was last updated on 2月 01, 2019, at 11:13:23 午前.

Eggplant icon Eggplant.io | Documentation Home | User Forums | Support | Copyright © 2019 Eggplant