Runtime exceptions
From OpenSimulator
Steevithak (Talk | contribs) m (fixed some typos) |
|||
(11 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | When | + | When errors are detected while executing a program, like a division by zero, access to an invalid memory location, etc., most languages provide a way to define code to try to handle them.<br> |
− | Default action is usually to issue a message and kill the program. | + | Default action is usually to issue a message and kill the program.<br> |
− | .Net (the enviroment OpenSimulator runs on) creates a block of data (object) called Exception, with information about what happened and where. | + | .Net (the enviroment OpenSimulator runs on) creates a block of data (a class object) called an <em>Exception</em>, with information about what happened and where.<br> |
− | runtime control code | + | The runtime control code aborts current execution and looks if the code path being executed is inside a <em>try</em>block. If there are <em>catch</em> blocks after it, the runtime calls them with the Exception as argument, so their code can try to handle it, preventing the program from dying.<br> |
− | There can be | + | There can be derivative types of Exception, to make more clear the problem, and even allow the inclusion of more specific information.<br> |
− | Using this mechanism, programs can also create their own types and issue (throw) them when there is a need to abort execution, and go back to a relevant catch{} block. | + | A catch can be made only sensitive to a specific type of exceotion by just declaring it using the type name as argument:<br> |
− | This is for example how llResetScript stops the script execution and goes back to control. | + | catch(exceptionTypeName ex) |
+ | Using this mechanism, programs can also create their own types and issue (<em>throw</em>) them when there is a need to abort execution, and go back to a relevant catch{} block. | ||
+ | This is for example how llResetScript stops the script execution and goes back to control, that then does the reset. | ||
− | On YEngine lower case in used for exception names, and only knows 2 types, for now. | + | On YEngine lower case in used for exception type names, and it only knows 2 types, for now. |
* exception ( ie .net Exception) means any kind of Exception a script can be allowed to intercept. | * exception ( ie .net Exception) means any kind of Exception a script can be allowed to intercept. | ||
− | * scriptexception (.net ScriptException) | + | * scriptexception (.net ScriptException) an exception issued by the script's supporting code. |
− | + | Most relevant cases for scripts will be of type scriptexception.<br> | |
− | + | Note that scriptexception and any other exception types are also an exception (they derive from it), so a catch(exception ex) will be triggered by it.<br> | |
+ | <br> | ||
+ | |||
+ | This limited set of exception types is because the scripts support code was made for XEngine, and needs to support it. For example a division by zero could just be the .net DivideByZeroException, instead it is converted into scriptexception. | ||
+ | So we need to look to the exception message to identify what they really are. | ||
+ | Note that this limited set also makes life easier for YEngine scripts error handling, so is not really a XEngine limitation. |
Latest revision as of 07:50, 21 September 2020
When errors are detected while executing a program, like a division by zero, access to an invalid memory location, etc., most languages provide a way to define code to try to handle them.
Default action is usually to issue a message and kill the program.
.Net (the enviroment OpenSimulator runs on) creates a block of data (a class object) called an Exception, with information about what happened and where.
The runtime control code aborts current execution and looks if the code path being executed is inside a tryblock. If there are catch blocks after it, the runtime calls them with the Exception as argument, so their code can try to handle it, preventing the program from dying.
There can be derivative types of Exception, to make more clear the problem, and even allow the inclusion of more specific information.
A catch can be made only sensitive to a specific type of exceotion by just declaring it using the type name as argument:
catch(exceptionTypeName ex)
Using this mechanism, programs can also create their own types and issue (throw) them when there is a need to abort execution, and go back to a relevant catch{} block. This is for example how llResetScript stops the script execution and goes back to control, that then does the reset.
On YEngine lower case in used for exception type names, and it only knows 2 types, for now.
- exception ( ie .net Exception) means any kind of Exception a script can be allowed to intercept.
- scriptexception (.net ScriptException) an exception issued by the script's supporting code.
Most relevant cases for scripts will be of type scriptexception.
Note that scriptexception and any other exception types are also an exception (they derive from it), so a catch(exception ex) will be triggered by it.
This limited set of exception types is because the scripts support code was made for XEngine, and needs to support it. For example a division by zero could just be the .net DivideByZeroException, instead it is converted into scriptexception. So we need to look to the exception message to identify what they really are. Note that this limited set also makes life easier for YEngine scripts error handling, so is not really a XEngine limitation.