スクリプトの途中で、処理を中断したい場合が時々有りますが、まず一番基本的な方法として、return文を使ってハンドラを終了する方法が考えられます。
interruptHandler()
-- ここから後は実行される
display dialog "呼び出し側"
on interruptHandler()
return -- 値は返さなくても使える
-- この後は実行されない
display dialog "呼び出されたハンドラ"
end interruptHandler
暗黙のrunハンドラでも使えます。
return -- 値は返さなくても使える
-- この後は実行されない
beep
display dialog命令などでキャンセルを選んだ場合に返されるのと同じエラーを発生させれば、エラーダイアログも出ずに終了できます。
これはどのハンドラで実行してもいきなり終了します。エラーを発生させるのはerror命令を利用します。
interruptHandler()
-- ここから後も実行されない
display dialog "呼び出し側"
on interruptHandler()
error number -128
-- この後は実行されない
display dialog "呼び出されたハンドラ"
end interruptHandler
tryブロックでエラーを発生させれば、on errorの場所までのスクリプトをキャンセルできます。
この場合、予期しないエラーが発生した場合に気付かない可能性がありますから、システム関連のエラーとぶつからないように500〜10,000エラー番号を利用し、それ以外のエラーの場合は、きちんとエラーを発生させてやるという処理を行うべきでしょう。
repeat with i from 1 to 5
try
if i = 4 then error number 1000
display dialog i
on error number n
if n /= 1000 then error number n
end try
end repeat
ここでは、実行されるとその命令以降のブロックは無視されて次のループに入るようにしています。このような構文はAppleScriptには無いので、tryを使って擬似的に実現しているわけです。
これはあまり真っ当なやり方では無いので、通常は、以下のようにifブロックを使って処理することになります。
repeat with i from 1 to 5
if i /= 4 then
display dialog i
end if
end repeat
この方法は、repeatの中で使わなければいけないという事はなく、色々な場面での応用が可能ですが、多用は避けるべきでしょう。
exit repeatを使えば、repeatブロックをすっ飛ばして終了する事ができます。
この場合、先ほどのtryを利用したものと違い、必ずrepeatブロックを脱出します。
repeat
set i to random number 4
if i = 4 then exit repeat
display dialog i
end repeat
特にループを作る必要が無い場合は、repeat 1 timesを使います。
repeat 1 times
exit repeat
-- ここから、end repeatまでは実行されない
display dialog "repeatブロックの中"
end repeat
-- ここから、実行される
display dialog "repeatブロックの外"
これも、あまり真っ当な方法ではありませんが、try構文を利用するよりは多少はいいでしょう。
そもそも、ここで紹介した方法のうちのどれか一つでも使わなければいけない状態になったら、「アルゴリズムに欠陥がある」可能性が高いので、できるだけ使わないで済ますようにしましょう。
まぁ程度問題ですが。