セカンドライフのスクリプトのエラー処理について

セカンドライフ制作
スポンサーリンク

はじめに

セカンドライフでは、スクリプトでエラーが起きるとどうなるかみなさん知っていますか。
何かエラーが出ること自体は知っていると思いますが、
そのエラーが発生後、どうなるのかはそんなに知らないと思います。

クイズ!

ためしに、次のようなスクリプトを実行してみましょう。

hoge() {
	integer x = 0;
	llOwnerSay("hoge_start");
	x = 1 / 0;
	llOwnerSay("hoge_end");
}

default {
	state_entry() {
		llSetTimerEvent(3.0);
	}
	
	touch_start(integer total_number) {
		llOwnerSay("touch_start");
		hoge();
		llOwnerSay("touch_end");
	}
	
	timer() {
		llOwnerSay("clock");
	}
}

このスクリプトは、3秒に1度、発言が行われて、
また、クリックすると0の割り算エラーを発生させるスクリプトです。

これでクリックするとどうなると思いますか。三択問題です。

A. hoge関数内でエラーが発生するので、例外で終了するため”hoge_end”は表示されずに、関数を抜ける
B. touch_startイベント関数内でエラーが発生するので、そこでtouch_startイベント関数が強制終了する
C. プログラム自体が強制終了し、タイマーイベントなど全てが止まる

さて、どうなるでしょう。

正解

正解は・・・

テテテテテテテ

ジャン!

 

Cでした!

 

なんと、すべて止まってしまうのです。
無限ループもタイマーもすべて止まってしまうので、手動リセットさせるしかありません。
なお、エラーの種類は「LSL Errors」でまとまっていますので、一度見ておくといいかもしれません。
注意点として、メモリリークの「Script run-time error: Stack-Heap Collision」なのですが、
これも発生してしまうと、プログラムが止まってしまいます。
そこで、止まるよりはみずから llGetFreeMemory で定期チェックをして、
llResetScript でリセットさせたほうが安全です。


オマケ

次のスクリプトはエラーが発生するでしょうか……

default {
	state_entry() {
		llOwnerSay((string)((integer)"ABC"));
		llOwnerSay((string)((integer)"123ABC456"));
		llOwnerSay((string)((vector)"ABC"));
		llOwnerSay((string)((vector)"<1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0>"));
	}
}


正解はこんな感じでエラーは発生しません。
文字列の左からデータとして認識できる範囲で変換してくれるようですね。

Object: 0
Object: 123
Object: <0.00000, 0.00000, 0.00000>
Object: <1.00000, 2.00000, 3.00000>

コメント

タイトルとURLをコピーしました