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