Exception handling: Difference between revisions

From Bohemia Interactive Community
(moving discussions to talk page)
(Some wiki formatting, Add alt syntax, Add Introduced with category)
 
(5 intermediate revisions by 4 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.
{{GVI|arma1|1.00}}


Standard construction is:
{{arma1}} introduced exception handling through the [[try]], [[catch]] and [[throw]] scripting commands, allowing scripts to create and react to exceptions.


try {
Standard structure:
    //block, that can throw exception
<sqf>
    if (_name == "") then {
try // code block that can throw exception
        throw "no name"
{
    } else {
if (_name == "") then { throw "no name"; }; // this exits the [[try]] block and enters the [[catch]] block below
        TitleText [format["Good morning, Captain %1.", _name], "PLAIN DOWN"]
if (_name == "") throw "no name"; // since {{arma3}} v1.54
        ~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.)
titleText [format ["Good morning, Captain %1.", _name], "PLAIN DOWN"];
}
catch // code block that processes an exception
{
if (_exception == "no name") then
{
hint "Name was not entered";
titleText ["Good morning, anonymous Captain.", "PLAIN DOWN"];
};
};
</sqf>


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


{{Feature|important|
{{Name|rv}} scripting commands do '''not''' create SQF exceptions by themselves if they encounter an illegal situation,
they throw a '''''compilation''''' exception that cannot be caught by this try-catch structure explained here.


[[Category: Scripting Topics|Exception Handling]]
The following would therefore '''not''' create a catchable exception:
<sqf>
_divider = 0;
try { a = 1 / _divider; } // SQF error happens here already
catch { hint "illegal operation"; }; // useless
</sqf>
 
The proper way:
<sqf>
_divider = 0;
try { if (_divider == 0) then { throw "div0"; }; a = 1 / _divider; }
catch { hint "illegal operation"; };
</sqf>
}}
 
 
[[Category: Scripting Topics]]
[[Category:Introduced with Armed Assault version 1.00]]

Latest revision as of 18:15, 7 January 2026

Logo A1 black.png 1.00

Armed Assault introduced exception handling through the try, catch and throw scripting commands, allowing scripts to create and react to exceptions.

Standard structure:

try // code block that can throw exception { if (_name == "") then { throw "no name"; }; // this exits the try block and enters the catch block below if (_name == "") throw "no name"; // since Arma 3 v1.54 titleText [format ["Good morning, Captain %1.", _name], "PLAIN DOWN"]; } catch // code block that processes an exception { if (_exception == "no name") then { hint "Name was not entered"; titleText ["Good morning, anonymous Captain.", "PLAIN DOWN"]; }; };


Real Virtuality scripting commands do not create SQF exceptions by themselves if they encounter an illegal situation,

they throw a compilation exception that cannot be caught by this try-catch structure explained here.

The following would therefore not create a catchable exception:

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

The proper way:

_divider = 0; try { if (_divider == 0) then { throw "div0"; }; a = 1 / _divider; } catch { hint "illegal operation"; };