Some commands produce errors, and if your program tries to run such a command it will halt with an error. To avoid this, you can use the try and catch commands. To use these, you put any potentially problematic statements in a block following try, and immediately after the block put catch with an argument of an unused symbol. If the try block doesn’t produce an error, then catch and the block following catch will be ignored. If the try block does produce an error, then a string describing the error is assigned to the argument to catch, and the block following catch is evaluated. For example, the command
will produce an error saying Error: Invalid dimension. However,
try {[[1,1]]*[[2,2]]} catch (err) { print("The error is " + err) }
will not produce an error; instead it will print
With the following program
test(x) := { local y, str, err; try { y := [[1,1]]*x; str := "This produced a product.";} catch (err) {y := x; str := "This produced an error " + err + " The input is returned.";} print(str); return y; }
if you enter
then
will be printed and the result will be
. If you enter
then
will be printed and the result will be
You can use the throw command (or equivalently, the error or ERROR command) to generate an error and error string, possibly to be caught by catch. The throw command takes as argument a string, which will be used as the error message. For example, suppose you have the program
f(x) := { if (type(x) != DOM_INT) throw("Not an integer"); else return x; }
Then
will simply return
since 12 is an integer, but
will signal an error
since 1.2 in not an integer. You can catch this error in other programs; the program
g(x) := { try(f(x)) catch(err) {x := 0;} return x; }
will return x is x is an integer, but if x is not an integer, f(x) will give an error and so g(x) will return 0.