beautypg.com

Recoverable internal errors – HP Integrity NonStop J-Series User Manual

Page 250

background image

opportunity for recovering from them.

Bounds errors are non-recoverable because the cost of checking to make sure an index is in
range can well exceed the cost of the array access itself. If a program does a lot of array
accesses, checking every one may result in a slow program. To avoid this, the library may
require you to always use a valid index. Because a minimum level of correctness is demanded,
non-recoverable errors are simple in concept and relatively easy to avoid.

You can best discover and eliminate non-recoverable errors by compiling and linking your
application with the debug version of the library. See

The Debug Version of Tools.h++

for

details. The debug version includes lots of extra checks designed to uncover coding errors.
Some of these checks may take extra time, or even cause debug messages to be printed out, so
you will want to compile and link with the production version for an efficient final product.

If the debug version of the library discovers an error, it typically aborts the program.

Recoverable Internal Errors

Recoverable internal errors are similar to their non-recoverable relatives in that they are easy to
predict and occur at low levels. They differ in that they are:

Not costly to detect;

Detected in both the debug and the production versions of the library.

A bounds error in a linked list or an attempt to use an invalid date are both examples of
recoverable internal errors. The library's response to these errors is to throw an exception
inheriting from RWInternalErr.

The production version of the library can check for recoverable internal errors because the cost
is relatively low. For example, to find a bounds error in a linked list, the cost of walking the list
will far exceed the cost of detecting whether the index is in bounds. Hence, you can afford to
check for a bounds error on every access.

If an error is discovered, the library will throw an exception inheriting from RWInternalErr, as
we have mentioned. Here's what it looks like when Tools.h++ throws an exception:

// Find link "i"; the index must be in range:
RWIsvSlink* RWIsvSlist::at(size_t i) const
{
if (i >= entries()){
if(RW_NPOS == i)
RWTHROW( RWBoundsErr( RWMessage( RWTOOL_NPOSINDEX)));
else
RWTHROW( RWBoundsErr( RWMessage( RWTOOL_INDEXERR,
(unsigned)i,
(unsigned)entries()) ));
}

This manual is related to the following products: