HSPで例外(マクロ)

マクロで実装。
その特性上、関数やサブルーチン内から外に向けたthrowは行えません。(内部で例外ブロックを使用することは可能。)
また、finallyの実装が完全ではありません。
finallyの実行はcatchの後となり、またtryやcatch内でgotoやbreak、returnなどを実行した場合にはfinallyは実行されません。

マクロで実装。
その特性上、関数やサブルーチン内から外に向けたthrowは行えません。(内部で例外ブロックを使用することは可能。)
また、finallyの実装が完全ではありません。
finallyの実行はcatchの後となり、またtryやcatch内でgotoやbreak、returnなどを実行した場合にはfinallyは実行されません。

#define global try %tException %i=0:%i=0:if'%i'
#define global finally %tException if 1
#define global ctype catch(%1) %tException *%o:%1=%o:if %o
#define global throw(%1) %tException %p1=%1:%p2=1:goto*%p0


	mes "--------------------"
	
	try {
		mes "--try1"
		throw 1234567
		// throw "Test"
	} catch(e) {
		mes "--catch1 " + e
	} finally {
		mes "--finally1"
	}
	
	mes "--------------------"
	
	try {
		mes "--try2"
		// throw 1234567
		throw "Test"
	} catch(e) {
		mes "--catch2 " + e
	} finally {
		mes "--finally2"
	}
	
	mes "--------------------"
	
	try {
		mes "--try3"
		// throw 1234567
		// throw "Test"
	} catch(e) {
		mes "--catch3 " + e
	} finally {
		mes "--finally3"
	}
	
	mes "--------------------"
	
	try {
		mes "--try4"
		throw 1.234567
	} catch(e) {
		mes "--catch4 " + e
	}
	
	mes "--------------------"
	
	try {
		mes "--try5"
	} catch(e) {
		mes "--catch5 " + e
	}
	
	mes "--------------------"
	
	stop