Exception handling: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(add. disclaimer)
m (Some wiki formatting)
 
(9 intermediate revisions by 9 users not shown)
Line 1: Line 1:
In Armed Assault exception handling is an implemented system of special scripting commands ([[try]], [[catch]] and [[throw]]), which allows your scripts to create and to react to exceptions.
In {{arma1}} exception handling is an implemented system of special scripting commands ([[try]], [[catch]] and [[throw]]), which allows your scripts to create and to react to exceptions.


Standard construction is:
Standard construction is:
<sqf>
try
{
// code block that can throw exception
if (_name == "") then
{
throw "no name";
}
else
{
titleText [format ["Good morning, Captain %1.", _name], "PLAIN DOWN"];
sleep 1;
titleText [_name, "PLAIN DOWN"];
};
}
catch
{
// code block that processes an exception
if (_exception == "no name") then
{
hint "Name was not entered";
titleText ["And the name isn't", "PLAIN DOWN"];
};
};
</sqf>


try {
{{Feature|important|{{Name|arma}} scripting commands do '''not''' create SQF exceptions by themselves if they encounter an illegal situation, they throw a compilation exception (i.e. the here-described exception handling cannot be used for error trapping).
    //block, that can throw exception
    if (_name == "") then {
        throw "no name"
    } else {
        TitleText [format["Good morning, Captain %1.", _name], "PLAIN DOWN"]
        ~1
        TitleText [_name, "PLAIN DOWN"]
}<br>
catch {
    //block, that processes an exception
    if (_exception == "no name") then {
        echo "Name wasn't entred"
        TitleText ["And the name isn't", "PLAIN DOWN"]
    }
}


'''Note:''' ArmA scripting commands do '''not''' create an exception by themselves if they encounter an illegal situation (i.e. you can't use the here described exception handling for error trapping.)
The following would therefore '''not''' create a catchable exception:
<sqf>
try
{
a = 1 / 0; // SQF error happens here already
}
catch
{
hint "illegal operation"; // useless
};
</sqf>
}}


The following would therefore '''not''' create a catchable exception:
<code>try {a=1/0;} catch {hint "illegal operation";}</code>


 
[[Category: Scripting Topics]]
 
----
 
 
Probably is this possible too:
 
{{Box File|[] fireBomb.sqs|<pre>
_car = _this select 0
if (crew _car == 0) then {
    throw "vehicle empty"
} else {
    if (3 < random 10) then {
        throw "bomb failed"
    } else {
        _car setDammage 1
        if (alive Guba) then {
            throw "bastard still alive"
        }
    }
}     
</pre>}}
 
try {
    TitleText ["Sgt. Detritus: I get bomb to his car ;-)", "PLAIN DOWN"]
    [jeepOne] exec "fireBomb.sqs"
    TitleText ["Sgt. Detritus: He is dead!", "PLAIN DOWN"]
}<br>
catch {
    if (_exception == "vehicle empty") then {
        TitleText ["Sgt. Detritus: He have luck, but next time I'll kill him!", "PLAIN DOWN"]
    } else {
        TitleText [format["Sgt. Detritus: Some strange error appears... %1... hmm... another time I'll get him!", _exception], "PLAIN DOWN"]
}
 
In OFP, "exec" was asynchronous - think spawning another thread. (ArmA will make this slightly more explicit with the command spawn) As such, an exception won't unwind into the caller so that it can be caught and used there. Though firebomb.sqs would preferrably be inlined to begin with, using "call preprocessfile firebomb.sqf" would be getting you the effect you want. Besides, it could go into "he is dead" before firebomb.sqs' first line got executed.
 
There are, however, several things about the piece of code above worthy of criticism. First of all, the handler is a catch(anything) (as ofpscript forces it to be) but the handler assumes it to be a string. {if typeof _exception != "string" throw } as the first command in the handler should properly rethrow the exception so it can be handled even further out. (The last throw might require _exception as a parameter.) 
 
The second, and bigger problem, is that the exception handling is used as a way of returning values. Exceptions ''should'' be used exclusively for runtime handling of error conditions. At least traditionally, this was so because exceptions are rather "expensive" in use, but generally speaking, the only proper reason for such usage is the lack of other suitable ways of returning results.  It's good form, and helps maintainability.
 
Exceptions are most useful when different people work on interacting pieces of code.
 
--[[User:MaHuJa|MaHuJa]] 07:29, 23 August 2006 (CEST)
 
[[Category:ArmA: Scripting|Exception Handling]]

Latest revision as of 00:14, 22 July 2022

In Armed Assault exception handling is an implemented system of special scripting commands (try, catch and throw), which allows your scripts to create and to react to exceptions.

Standard construction is:

try { // code block that can throw exception if (_name == "") then { throw "no name"; } else { titleText [format ["Good morning, Captain %1.", _name], "PLAIN DOWN"]; sleep 1; titleText [_name, "PLAIN DOWN"]; }; } catch { // code block that processes an exception if (_exception == "no name") then { hint "Name was not entered"; titleText ["And the name isn't", "PLAIN DOWN"]; }; };

Arma scripting commands do not create SQF exceptions by themselves if they encounter an illegal situation, they throw a compilation exception (i.e. the here-described exception handling cannot be used for error trapping).

The following would therefore not create a catchable exception:

try { a = 1 / 0; // SQF error happens here already } catch { hint "illegal operation"; // useless };