 |
Returning TI-Basic Errors |
Basically, you can return errors using
ER_throw or
ER_throwVar from
error.h. Many functions from this library
throw errors, which you can simply pass on to the operating system, possibly using
TRY...FINALLY...ENDFINAL blocks.
However, for the system to operate normally after this, you need to write
#define ENABLE_ERROR_RETURN
at the beginning of your program. Otherwise, the screen will not be updated
properly and other cleanup code (for example for USE_INTERNAL_FLINE_EMULATOR
)
is not executed. Most importantly, however, the program handle remains locked
in AMS 1.xx because of a bug in the operating system. If you try to start the
program again, you will get an "Invalid Program Reference" error.
Note: The workaround for this bug works only in kernel-less programs.
For kernel-based programs, working around the bug is the kernel's
responsibility. If you want to use this directive in kernel mode, you need to
check which kernels perform such a workaround, and tell your users about this
fact.
The following example (called "Memory Error") demonstrates how this directive
may be used together with
TRY...FINALLY...ENDFINAL blocks:
// Allocate memory as long as possible, then throw an error
// All allocated memory will be freed again!
#define USE_TI89 // Compile for TI-89
#define USE_TI92PLUS // Compile for TI-92 Plus
#define USE_V200 // Compile for V200
#define MIN_AMS 100 // Compile for AMS 1.00 or higher
#define ENABLE_ERROR_RETURN // Enable Returning Errors to TIOS
#include <tigcclib.h> // Include All Header Files
#define BLOCK_SIZE 1024
void AllocRecursively(void)
{
void *ptr = malloc_throw (BLOCK_SIZE);
TRY
// Could do something with ptr here...
AllocRecursively ();
// Could still do something with ptr...
FINALLY
free (ptr);
ENDFINAL
}
// Main Function
void _main(void)
{
AllocRecursively ();
}