union exn { // system defined void Null_access; void Match_failure; void Not_found; // user defined string Syntax_error; void ICE; }
New members are added with exception keyword:
exception string Syntax_error; exception void ICE;
In order to signal unusual situation, you use raise keyword:
raise Syntax_error["parse error"]; raise ICE; raise ICE[];
At the place, where you know how to handle it, you use try:
try { open_file(); ... parse(); ... } with e { case Syntax_error[s]: print_msg(s); case ICE: print_msg("Internal Compiler Error"); } finally { close_file(); }
First we open some file, then we call parse(), that can raise Syntax_error or ICE in which case we print error message, or something else, but in then control is transfered to upper-level try block. No matter how control leaves try {} block instructions in finally { ... } are executed. So we always close the file.
[[Nope... but they are expected right after modules, which means Real Soon Now. But I guess there will be only very partial support, just for system exceptions, until pattern matching is done]]