Go to the Next or Previous section, the Detailed Contents, or the Amiga E Encyclopedia.


13.3 Automatic Exceptions

In the previous section we saw an example of raising an exception when a call to New returned NIL. We can re-write this example to use automatic exception raising:

CONST BIG_AMOUNT = 100000

ENUM ERR_MEM=1

RAISE ERR_MEM IF New()=NIL

PROC main() HANDLE
  DEF block
  block:=New(BIG_AMOUNT)
  WriteF('Got enough memory\n')
EXCEPT
  IF exception=ERR_MEM
    WriteF('Not enough memory\n')
  ELSE
    WriteF('Unknown exception\n')
  ENDIF
ENDPROC

The only difference is the removal of the IF which checked the value of block, and the addition of a RAISE part. This RAISE part means that whenever the New function is called in the program, the exception ERR_MEM will be raised if it returns NIL (i.e., the exception ERR_MEM is automatically raised). This unclutters the program by removing a lot of error checking IF statements.

The precise form of the RAISE part is:

RAISE exception  IF function()  compare  value ,
      exception2 IF function2() compare2 value2 ,
      ...
      exceptionN IF functionN() compareN valueN

The exception is a constant (or number) which represents the exception to be raised, function is the E built-in or system function to be automatically checked, value is the return value to be checked against, and compare is the method of checking (i.e., `=', `<>', `<', `<=', `>' or `>='). This mechanism only exists for built-in or library functions because they would otherwise have no way of raising exceptions. The procedures you define yourself can, of course, use Raise to raise exceptions in a much more flexible way.


Go to the Next or Previous section, the Detailed Contents, or the Amiga E Encyclopedia.