スクリプトの中断

returnで中断

 スクリプトの途中で、処理を中断したい場合が時々有りますが、まず一番基本的な方法として、return文を使ってハンドラを終了する方法が考えられます。
 

interruptHandler()
-- ここから後は実行される
display dialog "呼び出し側"

on interruptHandler()
	return -- 値は返さなくても使える
	-- この後は実行されない
	display dialog "呼び出されたハンドラ"
end interruptHandler

 暗黙のrunハンドラでも使えます。

return -- 値は返さなくても使える
-- この後は実行されない
beep

error -128で中断

 display dialog命令などでキャンセルを選んだ場合に返されるのと同じエラーを発生させれば、エラーダイアログも出ずに終了できます。
 これはどのハンドラで実行してもいきなり終了します。エラーを発生させるのはerror命令を利用します。

interruptHandler()
-- ここから後も実行されない
display dialog "呼び出し側"

on interruptHandler()
	error number -128
	-- この後は実行されない
	display dialog "呼び出されたハンドラ"
end interruptHandler

try + errorで中断

 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の中で使わなければいけないという事はなく、色々な場面での応用が可能ですが、多用は避けるべきでしょう。

repeat+exit 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構文を利用するよりは多少はいいでしょう。

 そもそも、ここで紹介した方法のうちのどれか一つでも使わなければいけない状態になったら、「アルゴリズムに欠陥がある」可能性が高いので、できるだけ使わないで済ますようにしましょう。
 まぁ程度問題ですが。


2000-05-29 -2000-06-12