Exception handling: Difference between revisions

From Bohemia Interactive Community
mNo edit summary
(Some wiki formatting, Add alt syntax, Add Introduced with category)
 
(23 intermediate revisions by 11 users not shown)
Line 1: Line 1:
[[Category:Armed Assault:Scripting]]
{{GVI|arma1|1.00}}


In Armed Assault is implemented system of [[Armde Assault:Scripting commands|scripting commands]] which allows your scripts react to lots of kinds of exceptions.
{{arma1}} introduced exception handling through the [[try]], [[catch]] and [[throw]] scripting commands, allowing scripts to create and react to exceptions.
Standard construction is:


try {
Standard structure:
    //block, that can throw exception
<sqf>
    if (_name == "") then {
try // code block that can throw exception
        throw "invalid _name"
{
    } else {
if (_name == "") then { throw "no name"; }; // this exits the [[try]] block and enters the [[catch]] block below
        TitleText ["And the name is:", "PLAIN DOWN"]
if (_name == "") throw "no name"; // since {{arma3}} v1.54
        ~1
        TitleText [_name, "PLAIN DOWN"]
}  


catch {
titleText [format ["Good morning, Captain %1.", _name], "PLAIN DOWN"];
    //block, that processes an exception
    if (_exception == "invalid _name") then {
        echo "Wrong name detected"
        TitleText ["And the name isn't", "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>


{{AnswerMe}}
Probably is possible this too:


try {
{{Feature|important|
    TitleText ["Sgt. Detritus: He have luck, but next time I'll kill him!", "PLAIN DOWN"]
{{Name|rv}} scripting commands do '''not''' create SQF exceptions by themselves if they encounter an illegal situation,
    [jeepOne] exec "killDriver.sqs"
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:
<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>
}}
 


catch {
[[Category: Scripting Topics]]
    if (_exception == "car empty") then {
[[Category:Introduced with Armed Assault version 1.00]]
        TitleText ["Sgt. Detritus: He have luck, but next time I'll kill him!", "PLAIN DOWN"]
    } else {
        TitleText ["Sgt. Detritus: Some strange error appears...", "PLAIN DOWN"]
}

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"; };