Assert statement: Difference between revisions
mNo edit summary |
mNo edit summary |
||
Line 1: | Line 1: | ||
The <var>Assert</var> statement tests a condition. A true condition can send diagnostic | |||
information to the terminal output and audit trail, and/or it can result in cancellation | |||
of the <var class="product">User Language</var> request. | |||
==Syntax== | |||
<p class="syntax"><span class="literal">Assert </span><span class="term">cond</span><span class="squareb"> [</span><span class="literal">, </span><span class="squareb">[</span><span class="literal">Snap</span><span class="squareb">] [</span><span class="literal">Info </span><span class="term">info</span><span class="squareb">] [</span><span class="literal">Continue</span><span class="squareb">] ]</span> | |||
</p> | |||
===Syntax terms=== | |||
<table class="syntaxTable"> | |||
<tr><th>cond</th><td>The conditions that are being asserted as true. These conditions have exactly the same syntax as conditions on IF statements.</td></tr> | |||
<tr><th><var>Snap</var></th><td>Indicates a CCASNAP is to be taken on an assertion failure. A CCASNAP is taken in addition to, but before, any SirFact dump associated with the assertion failure.</td></tr> | |||
<tr><th>info</th><td>Extra information that is included in the audit trail and terminal output for the assertion failure as part of a MSIR.0494 message. As of <var class="product">Sirius Mods</var> version 6.7, if <var class="term">info</var> is a %variable, the contents of the indicated variable is output. <var class="term">info</var> must be enclosed in quotes if it contains spaces or other <var class="product">Model 204</var> separator characters. If <var class="term">info</var> is not a %variable, and is not enclosed in quotes, that uppercased literal string is output. | |||
</td></tr> | |||
<tr><th><var>Continue</var></th><td>Indicates that an assertion failure will not cause the request to be cancelled. An MSIR.0494 message, and possibly a SirFact dump, will still be produced, but the request will continue.</td></tr> | |||
</table> | |||
==Examples== | |||
Some valid <var>Assert</var> statements are: | |||
<p class="code"> assert (%x gt 0) and (%name ne <nowiki>''</nowiki>) | |||
assert %x gt 0, snap | |||
assert not $setg('name', 'value') | |||
assert %x = 22, info %x | |||
assert %x, info 'zero %x' snap | |||
assert %income gt 10000, continue | |||
assert %income gt 10000000, info highroller continue | |||
</p> | |||
''Note:'' As of Sirius Mods version 6.7, a %variable in the Info clause is interpreted to mean the contents of the indicated variable. For example, the fourth <var>Assert</var> statement | |||
above (<code>assert %x = 22, info %x</code>) produces the following message if <code>%x</code> is 21: | |||
<p class="output">MSIR.0494: Assert info: 21</p> | |||
For versions prior to 6.7, an unquoted %variable name is interpreted as a literal, and the message produced is: | |||
<p class="output">MSIR.0494: Assert info: %X</p> | |||
==Usage notes== | |||
An <var>Assert</var> statement uses the same expression handler as the IF statement, so it is exactly as efficient as an IF statement with the same conditions. | |||
To use an <var>Assert</var>, simply place it before any code that depends on some assumptions | |||
about variables or the environment. <var>Assert</var> statements should be coded to test values | |||
or relationships that are required for the code to run correctly, but whose values are not | |||
immediately apparent from the surrounding code. | |||
In addition to catching coding errors, the <var>Assert</var> statement provides the following | |||
benefits : | |||
*It makes clear the assumptions that the code depends on to anyone scanning the program. This makes it easier to understand the surrounding code. Similarly, it makes the environmental requirements clear to someone wanting to re-use a code fragment or call a common subroutine. While these benefits can be achieved with comments, the <var>Assert</var> statement has the added benefit that it enforces the restrictions. | |||
*It eliminates doubt when scanning code while trying to debug a problem, and it prevents wasted time on �what if� scenarios that can be ruled out with a simple <var>Assert</var>. | |||
==Discussion== | |||
Programming errors often cause symptoms that point directly to the error. For example, | Programming errors often cause symptoms that point directly to the error. For example, | ||
an incorrectly coded array assignment might result in a subscript range error on the very | an incorrectly coded array assignment might result in a subscript range error on the very | ||
Line 5: | Line 49: | ||
kinds of programming errors are generally easy to isolate and fix, and they are usually | kinds of programming errors are generally easy to isolate and fix, and they are usually | ||
caught during adhoc debugging or fairly quickly after a program goes into production. | caught during adhoc debugging or fairly quickly after a program goes into production. | ||
Yet many other programming errors can cause more subtle problems that cause | Yet many other programming errors can cause more subtle problems that cause | ||
completely unrelated statements to fail, or even cause corruption of data that might not | completely unrelated statements to fail, or even cause corruption of data that might not | ||
Line 14: | Line 58: | ||
data. The code may execute but produce invalid results, or perhaps it may set values | data. The code may execute but produce invalid results, or perhaps it may set values | ||
incorrectly that can cause problems in yet another part of the code. | incorrectly that can cause problems in yet another part of the code. | ||
There are several ways to deal with this problem with assumptions: | There are several ways to deal with this problem with assumptions: | ||
* Don't make assumptions in code. While it is an admirable goal to make code as flexible as possible, taken to the extreme, this approach produces code that is bloated by instructions to handle cases that never happen, setting return codes and status values that should never be set that then have to be checked elsewhere. Put another way, code has to do not only what is necessary but also has to perform many unnecessary tasks. | * Don't make assumptions in code. While it is an admirable goal to make code as flexible as possible, taken to the extreme, this approach produces code that is bloated by instructions to handle cases that never happen, setting return codes and status values that should never be set that then have to be checked elsewhere. Put another way, code has to do not only what is necessary but also has to perform many unnecessary tasks. | ||
* Ignore the problem and hope for the best. | * Ignore the problem and hope for the best. | ||
* Check key assumptions in code, and terminate the program with appropriate diagnostics to isolate the cause of the termination. | * Check key assumptions in code, and terminate the program with appropriate diagnostics to isolate the cause of the termination. | ||
The last solution looks the most appealing. However, without the <var>Assert</var> statement, | The last solution looks the most appealing. However, without the <var>Assert</var> statement, | ||
collecting the appropriate diagnostic information can only be done in User Language, so | collecting the appropriate diagnostic information can only be done in User Language, so | ||
Line 29: | Line 73: | ||
* It causes the current request to be cancelled if the assumption is incorrect. In an APSY subsystem, this causes transfer to the subsystem error procedure. | * It causes the current request to be cancelled if the assumption is incorrect. In an APSY subsystem, this causes transfer to the subsystem error procedure. | ||
* It indicates the procedure and line number containing the failing <var>Assert</var> statement. Furthermore, in the presence of appropriate SIRFACT MAXDUMP and SIRFACT DUMP settings, it causes the creation of a SirFact dump that contains a wide variety of information about the program environment at the time of the error. For more information about SirFact dumps, see the SirFact Reference Manual. | * It indicates the procedure and line number containing the failing <var>Assert</var> statement. Furthermore, in the presence of appropriate SIRFACT MAXDUMP and SIRFACT DUMP settings, it causes the creation of a SirFact dump that contains a wide variety of information about the program environment at the time of the error. For more information about SirFact dumps, see the SirFact Reference Manual. | ||
Stated another way, the <var>Assert</var> statement allows testing of assumptions and extensive | Stated another way, the <var>Assert</var> statement allows testing of assumptions and extensive | ||
diagnostic data collection with a single, simple statement. | diagnostic data collection with a single, simple statement. | ||
[[Category:User Language statements]] | [[Category:User Language statements]] |
Revision as of 10:25, 7 February 2012
The Assert statement tests a condition. A true condition can send diagnostic information to the terminal output and audit trail, and/or it can result in cancellation of the User Language request.
Syntax
Assert cond [, [Snap] [Info info] [Continue] ]
Syntax terms
cond | The conditions that are being asserted as true. These conditions have exactly the same syntax as conditions on IF statements. |
---|---|
Snap | Indicates a CCASNAP is to be taken on an assertion failure. A CCASNAP is taken in addition to, but before, any SirFact dump associated with the assertion failure. |
info | Extra information that is included in the audit trail and terminal output for the assertion failure as part of a MSIR.0494 message. As of Sirius Mods version 6.7, if info is a %variable, the contents of the indicated variable is output. info must be enclosed in quotes if it contains spaces or other Model 204 separator characters. If info is not a %variable, and is not enclosed in quotes, that uppercased literal string is output. |
Continue | Indicates that an assertion failure will not cause the request to be cancelled. An MSIR.0494 message, and possibly a SirFact dump, will still be produced, but the request will continue. |
Examples
Some valid Assert statements are:
assert (%x gt 0) and (%name ne '') assert %x gt 0, snap assert not $setg('name', 'value') assert %x = 22, info %x assert %x, info 'zero %x' snap assert %income gt 10000, continue assert %income gt 10000000, info highroller continue
Note: As of Sirius Mods version 6.7, a %variable in the Info clause is interpreted to mean the contents of the indicated variable. For example, the fourth Assert statement
above (assert %x = 22, info %x
) produces the following message if %x
is 21:
MSIR.0494: Assert info: 21
For versions prior to 6.7, an unquoted %variable name is interpreted as a literal, and the message produced is:
MSIR.0494: Assert info: %X
Usage notes
An Assert statement uses the same expression handler as the IF statement, so it is exactly as efficient as an IF statement with the same conditions.
To use an Assert, simply place it before any code that depends on some assumptions about variables or the environment. Assert statements should be coded to test values or relationships that are required for the code to run correctly, but whose values are not immediately apparent from the surrounding code. In addition to catching coding errors, the Assert statement provides the following benefits :
- It makes clear the assumptions that the code depends on to anyone scanning the program. This makes it easier to understand the surrounding code. Similarly, it makes the environmental requirements clear to someone wanting to re-use a code fragment or call a common subroutine. While these benefits can be achieved with comments, the Assert statement has the added benefit that it enforces the restrictions.
- It eliminates doubt when scanning code while trying to debug a problem, and it prevents wasted time on �what if� scenarios that can be ruled out with a simple Assert.
Discussion
Programming errors often cause symptoms that point directly to the error. For example, an incorrectly coded array assignment might result in a subscript range error on the very statement with the error. Alternatively, an assignment from the wrong variable to a screen item results in incorrect data appearing in the corresponding screen field. These kinds of programming errors are generally easy to isolate and fix, and they are usually caught during adhoc debugging or fairly quickly after a program goes into production.
Yet many other programming errors can cause more subtle problems that cause completely unrelated statements to fail, or even cause corruption of data that might not be detected until long after the original error has occurred. This often happens because much code depends on assumptions about the current environment, including assumptions about values of variables. A coding error or a misunderstanding of the environmental requirements of a chunk of code can cause the code to be run with invalid data. The code may execute but produce invalid results, or perhaps it may set values incorrectly that can cause problems in yet another part of the code.
There are several ways to deal with this problem with assumptions:
- Don't make assumptions in code. While it is an admirable goal to make code as flexible as possible, taken to the extreme, this approach produces code that is bloated by instructions to handle cases that never happen, setting return codes and status values that should never be set that then have to be checked elsewhere. Put another way, code has to do not only what is necessary but also has to perform many unnecessary tasks.
- Ignore the problem and hope for the best.
- Check key assumptions in code, and terminate the program with appropriate diagnostics to isolate the cause of the termination.
The last solution looks the most appealing. However, without the Assert statement, collecting the appropriate diagnostic information can only be done in User Language, so it can be tedious (numerous AUDIT, PRINT, or $SETG statements), and it still provides only limited information. The Sirius Mods provides a User Language statement, Assert, to get around these problems. The Assert statement serves three functions:
- It tests the validity of an assumption.
- It causes the current request to be cancelled if the assumption is incorrect. In an APSY subsystem, this causes transfer to the subsystem error procedure.
- It indicates the procedure and line number containing the failing Assert statement. Furthermore, in the presence of appropriate SIRFACT MAXDUMP and SIRFACT DUMP settings, it causes the creation of a SirFact dump that contains a wide variety of information about the program environment at the time of the error. For more information about SirFact dumps, see the SirFact Reference Manual.
Stated another way, the Assert statement allows testing of assumptions and extensive diagnostic data collection with a single, simple statement.