exitWith: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "</dl> <dl class="command_description"> " to "")
(Some wiki formatting)
Line 18: Line 18:
|gr1= Program Flow
|gr1= Program Flow


|descr= Exits current scope {...} it is executed from if condition evaluates [[true]], creates new scope {...code...} and executes the given code in it. Often used for exiting [[do]], [[for]], [[count]] or [[forEach]]. Simply exiting [[waitUntil]] or [[onEachFrame]] scopes with [[exitWith]] will have no effect as these scopes are called repeatedly by the engine and require different handling to terminate (see Example 3).
|descr= Exits the '''current''' code scope. Often used for exiting [[do]], [[for]], [[count]], [[forEach]] or the whole script.
{{Feature|informative|See {{HashLink|Variables#Local Variables Scope}} for more information.}}


|s1= ifType [[exitWith]] code
|s1= ifType [[exitWith]] code


|p1= ifType: [[If Type]]
|p1= ifType: [[If Type]]
|p2= code: [[Code]]
|p2= code: [[Code]]


|r1= [[Anything]]
|r1= [[Anything]]


|x1= <code>[[if]] (_x>5) [[exitWith]] {[[echo]] "_x is too big"; _x}</code>
|x1= <code>[[systemChat]] "start";
[[private]] _condition = [[true]];


When _x is greater than 5, outputs message and terminates code in current level with value of _x.
[[if]] (_condition) [[then]]
{
[[if]] ([[true]]) [[exitWith]]
{
[[systemChat]] "exiting if _condition scope";
};
[[systemChat]] "never shown";
};
 
[[systemChat]] "exiting #1 worked";
 
[[if]] ([[true]]) [[exitWith]]
{
[[systemChat]] "exiting the main scope = leaving the whole script";
};
 
[[systemChat]] "never shown - the script has already ended";
</code>


|x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]]
|x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]]
{
{
[[player]] [[sideChat]] [[format]] ["%1",_j];
[[systemChat]] [[format]] ["%1", _j];
if (_j<nowiki>=</nowiki><nowiki>=</nowiki>5) [[exitWith]] {[[player]] [[sideChat]] "5 is enough"};
 
{{cc|the [[for]] loop will cease and code execution will continue after the end of the loop}}
[[if]] (_j == 5) [[exitWith]]
{
[[systemChat]] "5 is enough";
};
};
};
[[player]] [[sideChat]] "Complete";</code>
[[systemChat]] "Complete";</code>
''Only'' the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete").


|x3= Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as [[onEachFrame]] and [[waitUntil]] use the following examples:
|x3= Most loops will also terminate when their scope is exited. To exit and terminate scopes which are called every frame such as [[onEachFrame]] and [[waitUntil]] use the following examples:


<code>[[onEachFrame]] &#123;
<code>[[onEachFrame]] {
[[if]] (![[alive]] [[player]]) [[exitWith]] &#123;
[[if]] (![[alive]] [[player]]) [[exitWith]]
[[onEachFrame]] &#123;&#125;
{
&#125;
[[onEachFrame]] {};
&#125;
};
};
</code>
</code>


Line 53: Line 78:
[[if]] ([[time]] > _time) [[exitWith]] { [[true]] };
[[if]] ([[time]] > _time) [[exitWith]] { [[true]] };
[[false]]
[[false]]
}
};
</code>
</code>
|seealso=[[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]]
 
|x4= <code>[[while]] { [[true]] } [[do]]
{
[[if]] ([[alive]] [[player]]) [[then]]
{
[[if]] ([[time]] > 300) [[exitWith]] {{cc|'''wrong''' - it will only leave the "if alive player" scope, remaining in the "while true" loop forever}}
{
[[hint]] "exiting";
};
};
};</code>
 
|x5= <code>[[if]] (_condition) [[exitWith]]
{
[[hint]] "reached";
};
{{cc|[[else]] { [[hint]] "not reached" }; // '''wrong''' - using [[else]] does not work and makes no sense here}}
</code>
<code>[[if]] (_condition) [[exitWith]]
{
[[hint]] "reached";
};
[[hint]] "not reached"; {{cc|'''correct''' - if _condition is met, the scope has already been exited by now}}
</code>
 
|seealso= [[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]]
}}
}}


Line 64: Line 113:
<dd class="notedate">Posted on May 28, 2010 - 22:15</dd>
<dd class="notedate">Posted on May 28, 2010 - 22:15</dd>
<dt class="note">[[User:Roehre|Roehre]]</dt>
<dt class="note">[[User:Roehre|Roehre]]</dt>
<dd class="note">Since Arma 2 uses Blocks in FSM as any ordinary Handle like [[while]], [[for]] etc. in Scripts, '''ExitWith''' also only closes the Block in the FSM.
<dd class="note">Since Arma 2 uses Blocks in FSM as any ordinary Handle like [[while]], [[for]] etc. in Scripts, '''ExitWith''' also only closes the Block in the FSM.</dd>
 
<dt><dt>
<dt><dt>
<dd class="notedate">Posted on August 04, 2013 - 12:20</dd>
<dd class="notedate">Posted on August 04, 2013 - 12:20</dd>
<dt class="note">[[User:Killzone_Kid|Killzone_Kid]]</dt>
<dt class="note">[[User:Killzone_Kid|Killzone_Kid]]</dt>
<dd class="note">The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and [[exitWith]] have a look at [http://killzonekid.com/arma-scripting-tutorials-scopes/ this resource].
<dd class="note">The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and [[exitWith]] have a look at [http://killzonekid.com/arma-scripting-tutorials-scopes/ this resource].</dd>
<dt><dt>
<dd class="notedate">Posted on January 06, 2014 - 13:41</dd>
<dt class="note">[[User:NaughDylan|Naught]]</dt>
<dd class="note">To further explain [[User:Killzone_Kid|Killzone_Kid]]'s above statement, [[exitWith]] does not work as described within any subsequent inner scopes of a loop - it will only simply exit the current scope. For example, this code will not exit the while loop:
<dd class="note"><code>[[while]] {[[true]]} [[do]] { // 'while' scope
[[if]] ([[player]] == ([[leader]] [[player]])) [[then]] { // 'if-then' scope
[[if]] ([[time]] > (5 * 60)) [[exitWith]] {}; //  This will only exit the 'if-then' scope
};
[[sleep]] 1;
};
[[hint]] "Mission Started"; // This code will never execute</code>
 


<dt></dt>
<dt></dt>
Line 87: Line 125:
<dd class="note">
<dd class="note">
[[exitWith]] cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect:
[[exitWith]] cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect:
<code>// INCORRECT USAGE
<code>{{cc|INCORRECT USAGE}}
[[onMapSingleClick]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}};</code>
[[onMapSingleClick]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}};</code>
The override value must be returned in the main scope of EH, but since it is exited with [[exitWith]], it never happens. The correct way in this case would be:
The override value must be returned in the main scope of EH, but since it is exited with [[exitWith]], it never happens. The correct way in this case would be:
<code>// CORRECT USAGE
<code>{{cc|CORRECT USAGE}}
[[onMapSingleClick]] {[[call]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}}};</code>
[[onMapSingleClick]] {[[call]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}}};</code>
[[exitWith]] will exit current [[call]] scope only and override value therefore will appear in the main scope of the EH, right where we want it.
[[exitWith]] will exit current [[call]] scope only and override value therefore will appear in the main scope of the EH, right where we want it.
</dd>
<dt><dt>
<dd class="notedate">Posted on October 12, 2016 - 17:56 (UTC)</dd>
<dt class="note">[[User:RHfront|RHfront]]</dt>
<dd class="note"> exitWith does not use standard "if-then" syntax, but a unique "if-exitWith" structure.
<dd class="note"> exitWith will NOT take [[else]]. Attempts to do so will result in "Error exitwith: Type Array, expected code".
</dd>
</dd>


</dl>
</dl>

Revision as of 13:58, 9 August 2021

Hover & click on the images for description

Description

Description:
Exits the current code scope. Often used for exiting do, for, count, forEach or the whole script.
See Variables - Local Variables Scope for more information.
Groups:
Program Flow

Syntax

Syntax:
ifType exitWith code
Parameters:
ifType: If Type
code: Code
Return Value:
Anything

Examples

Example 1:
systemChat "start"; private _condition = true; if (_condition) then { if (true) exitWith { systemChat "exiting if _condition scope"; }; systemChat "never shown"; }; systemChat "exiting #1 worked"; if (true) exitWith { systemChat "exiting the main scope = leaving the whole script"; }; systemChat "never shown - the script has already ended";
Example 2:
for "_j" from 1 to 10 do { systemChat format ["%1", _j]; // the for loop will cease and code execution will continue after the end of the loop if (_j == 5) exitWith { systemChat "5 is enough"; }; }; systemChat "Complete";
Example 3:
Most loops will also terminate when their scope is exited. To exit and terminate scopes which are called every frame such as onEachFrame and waitUntil use the following examples: onEachFrame { if (!alive player) exitWith { onEachFrame {}; }; }; _time = time + 10; waitUntil { if (time > _time) exitWith { true }; false };
Example 4:
while { true } do { if (alive player) then { if (time > 300) exitWith // wrong - it will only leave the "if alive player" scope, remaining in the "while true" loop forever { hint "exiting"; }; }; };
Example 5:
if (_condition) exitWith { hint "reached"; }; // else { hint "not reached" }; // wrong - using else does not work and makes no sense here if (_condition) exitWith { hint "reached"; }; hint "not reached"; // correct - if _condition is met, the scope has already been exited by now

Additional Information

See also:
scopeNamebreakOutbreakToelseControl Structuresthenasserttrycatchthrow

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Posted on May 28, 2010 - 22:15
Roehre
Since Arma 2 uses Blocks in FSM as any ordinary Handle like while, for etc. in Scripts, ExitWith also only closes the Block in the FSM.
Posted on August 04, 2013 - 12:20
Killzone_Kid
The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and exitWith have a look at this resource.
Posted on March 10, 2016 - 08:31 (UTC)
Killzone Kid
exitWith cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect: // INCORRECT USAGE onMapSingleClick {if (!isServer) exitWith {true}}; The override value must be returned in the main scope of EH, but since it is exited with exitWith, it never happens. The correct way in this case would be: // CORRECT USAGE onMapSingleClick {call {if (!isServer) exitWith {true}}}; exitWith will exit current call scope only and override value therefore will appear in the main scope of the EH, right where we want it.