diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-03-24 21:51:16 +0100 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-03-24 21:51:16 +0100 |
commit | 87217fe5ba58f5199d30586b5d9bec104dece445 (patch) | |
tree | 00a43d11ebdfbb65750e80758ce1925e4c6a1a3e /exn_handler.sml | |
parent | e40727b58e357f123256557af50666aa42c2caa4 (diff) |
Partition into structures
Diffstat (limited to 'exn_handler.sml')
-rw-r--r-- | exn_handler.sml | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/exn_handler.sml b/exn_handler.sml new file mode 100644 index 0000000..2e3a0b2 --- /dev/null +++ b/exn_handler.sml @@ -0,0 +1,46 @@ +structure GlobalExnHandler: sig val handler: exn -> unit end = struct + + fun eprint s = printLn $ "error: " ^ s + + fun otherExn e = + let + val hist = MLton.Exn.history e + in + eprint $ "exception " ^ exnMessage e ^ " was raised"; + if hist = [] then + (printLn "No stack trace is avaliable"; + printLn "Recompile with -const \"Exn.keepHistory true\"") + else + List.app (fn x => printLn $ "\t" ^ x) hist + end + + fun exit code = Posix.Process.exit $ Word8.fromInt code + + fun ioExn (IO.Io { name, function = _, cause }) = + let + open OS + val prefix = name ^ ": " + val reason = + case cause of + SysErr (str, _) => str + | _ => exnMessage cause + in + printLn $ prefix ^ reason + end + | ioExn _ = (printLn "ioExn: unreachable"; exit 254) + + fun handler e = + let + open Tokenizer + in + (case e of + FsmTableIsTooSmall => + eprint "fsm table is too small. Increate 'maxState' value" + | IO.Io _ => ioExn e + | TkErrorAug (pos, msg) => eprint $ Stream.pos2str pos ^ ": " ^ msg + | _ => otherExn e; + exit 255) + end +end + +val () = MLton.Exn.setTopLevelHandler GlobalExnHandler.handler |