YENGtry
From OpenSimulator
m (Remplace pre by source) |
m |
||
(2 intermediate revisions by one user not shown) | |||
Line 10: | Line 10: | ||
* throw keyword allows a catch to reissue the exception, so the engine handles it normally | * throw keyword allows a catch to reissue the exception, so the engine handles it normally | ||
− | + | A try block must be follow by at least | |
− | + | ||
one or two of the following catch types (possible more in future), | one or two of the following catch types (possible more in future), | ||
one finally block | one finally block | ||
Line 17: | Line 16: | ||
<div style="background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid"> | <div style="background-color:#FFA500; padding:10px; padding-bottom:5px; border: 1px #FF544F solid"> | ||
− | '''at this time there are only 2 types of | + | '''at this time there are only 2 types of catch blocks |
to catch script related exceptions | to catch script related exceptions | ||
Line 26: | Line 25: | ||
catch(exception ex) { } | catch(exception ex) { } | ||
− | |||
in both cases particular exception must be found by looking to the message.<br> | in both cases particular exception must be found by looking to the message.<br> | ||
Line 32: | Line 30: | ||
Only the first that matches the exception type is executed, so if both needed scriptexception should be first.<br> | Only the first that matches the exception type is executed, so if both needed scriptexception should be first.<br> | ||
</div><br> | </div><br> | ||
− | |||
There are a few auxiliary functions. | There are a few auxiliary functions. | ||
Line 59: | Line 56: | ||
= Examples = | = Examples = | ||
+ | Make sure to add yoptions; to the second line of the script, usually line number 1 starting from 0. | ||
+ | |||
Silly example. | Silly example. | ||
Latest revision as of 18:15, 12 October 2022
There can not be any llResetScript, osResetAllScripts or llDie inside any of this blocks. script will compile but fail with a severe runtime error
try, catch and finally allow to handle some exceptions (see runtime exceptions) without getting the script killed.
- On the try block we place the code we want to run protected.
- On a catch blocks we place code to handle the exceptions
- On the finally block we place code that should always run.
- throw keyword allows a catch to reissue the exception, so the engine handles it normally
A try block must be follow by at least
one or two of the following catch types (possible more in future), one finally block all of those
at this time there are only 2 types of catch blocks
to catch script related exceptions
catch(scriptexception ex) { }
to catch any available exception a script can intercept:
catch(exception ex) { }
in both cases particular exception must be found by looking to the message.
The catch blocks types are checked by their order in source.
Only the first that matches the exception type is executed, so if both needed scriptexception should be first.
There are a few auxiliary functions.
[edit] string yExceptionMessage(exception ex)
returns a string with the message of the exception ex
[edit] string yExceptionTypeName(exception ex)
returns a string with system name of the exception. scriptexception will return ScriptException
so catch(scriptexception ex) could be
catch(exception ex) { if(yExceptionTypeName(ex) == "ScriptException") { ... } }
but catch(scriptexception ex) is faster and more readable
[edit] Examples
Make sure to add yoptions; to the second line of the script, usually line number 1 starting from 0.
Silly example.
touch_start(integer nn) { integer a = 0; try { llSay(PUBLIC_CHANNEL,"try"); float c = 1 / a; } catch(scriptexception ex) { if(yExceptionMessage(ex) == "Division by Zero") llSay(PUBLIC_CHANNEL,"Where did you learn math?"); else throw; } finally { llSay(PUBLIC_CHANNEL,"finaly"); } }
Detect no ossl permission.
touch_start(integer n) { try { key agent = llDetectedKey(0); osForceOtherSit(agent); } catch(scriptexception ex) { string message = yExceptionMessage(ex); if(osStringStartsWith(message,"ossl permission error", TRUE)) llSay(PUBLIC_CHANNEL, "You need to enable osForceOtherSit on osslEenable.ini"); else throw; } }