はじめに
セカンドライフでは、スクリプトでエラーが起きるとどうなるかみなさん知っていますか。
何かエラーが出ること自体は知っていると思いますが、
そのエラーが発生後、どうなるのかはそんなに知らないと思います。
クイズ!
ためしに、次のようなスクリプトを実行してみましょう。
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>



コメント