Signals / Error handling

Signalling in O means throwing an error. The idea is similar to raising exceptions in other languages. That is signals are meant to break normal calculation flow and report an error.

Trapping a signal means running a function and expecting any error occurance. Conceptually it is similar to "catch" clause in other languages.

Signals

Technically signalling is done using monadic verb '. Its argument is any value describing error.

o)a:10; { { '(`s;1); set[`a;0] }[] }[]
'`s
1
o)a
10
o)

Trap

Trapping is done using @ and . triads.

The @ triad applies its first argument (a monadic function) to its second argument. When function fails or signals, the entire expression becomes equal to third argument.

o)@[{x};1;`err2]
1
o)@[{'x};`err1;`err2]
`err2
o)

Another possible usage is trapping with a function as the third argument. When signal occurs, it leads to execution of the third argument function with signal value as an argument.

o)@[{'x};`err1;{x}]
`err1
o)

Runtime errors are also caught using traps. Trapping runtime errors results in a signal value with the error text message as its value.

o)@[{x+y};1;{x}]
"** exec error: +: invalid args [1;]
      |--> [REPL::1] @[{x+y};1;{x}]
                         ^"
o)

The . triad is pretty much the same expression except its second argument can be a list/vector. It is used as several arguments for a trapped function. Thus, it allows using a function with arity greater than 1.

o).[+;(1;2);`err2]
3
o).[{'y};(1;`err1);{x}]
`err1
o)