例外

パステルステッチでは、ホスト言語とゲスト言語にまたがって例外を使用できる。ホスト言語またはゲスト言語で例外をスルーすると、ゲスト言語で例外をキャッチできる。このとき、ゲスト言語が例外をキャッチしなければ、ホスト言語で例外をキャッチすることができる。

例外をスルーする

ホスト言語で例外をスルーするには guest_catchable_throw API または guest_catchable_assert API を用いる。これらの API では、例外の付属情報 (properties of exception) を指定できる。例外の付属情報は、文字列がキーであり、パステルステッチの値がバリューであるマップである。

ゲスト言語で例外をスルーするには throw プリミティブ演算を用いる。throw プリミティブ演算の引数は、例外の付属情報として使用される。

例外をキャッチする

動的環境は例外スタック (exception stack) を持つ。例外スタックはコンティニュエーションをプッシュすることができるスタックである。ホスト言語またはゲスト言語で例外をスルーすると、例外スタックが空でなければ、例外スタックの最上位にあるコンティニュエーションが実行される。例外の付属情報はコンティニュエーション引数として取得できる。例外スタックが空であれば、ホスト言語の例外がスルーされる。

ゲスト言語で例外をキャッチするには、例外スタックを明示的にプッシュする必要がある。例外スタックを操作するプリミティブ演算には以下のものがある。

これらのプリミティブ演算を使用して例外をキャッチするコードの例を以下に示す。

^code Exception
^name @ continuation argument
^loop
	^continuation exception +
		hold explicitly: by (#offset)
		> main [get dynamic environment identifier: [exception +]]
		push exception: [exception +]
		try something
		pop exception
		break
	^end
	^if [is catchable exception: @property of exception]
		do something when catch exception
		break
	^end
	throw: argument pack [get continuation arguments]
	assert: false
^endcode