summaryrefslogtreecommitdiff
path: root/exn_handler.sml
diff options
context:
space:
mode:
authorVladimir Azarov <avm@intermediate-node.net>2025-05-25 19:59:56 +0200
committerVladimir Azarov <avm@intermediate-node.net>2025-05-25 19:59:56 +0200
commitd9c809a5550b2fe23b2fd1e66672b503730d55f1 (patch)
tree6f8001d56823305f9f93c52833362b28e9d2def4 /exn_handler.sml
parent2a1cfad37d5e87b2d7eb3c9da16db66364a9b9a3 (diff)
Expression parsing
Diffstat (limited to 'exn_handler.sml')
-rw-r--r--exn_handler.sml36
1 files changed, 36 insertions, 0 deletions
diff --git a/exn_handler.sml b/exn_handler.sml
new file mode 100644
index 0000000..c0a2d7a
--- /dev/null
+++ b/exn_handler.sml
@@ -0,0 +1,36 @@
+structure ExnHandler: EXN_HANDLER = struct
+
+ val eprintf = fn z => printf `"error: " z
+
+ fun otherExn e =
+ let
+ val hist = MLton.Exn.history e
+ in
+ eprintf `"exception " `(exnMessage e) `" was raised\n";
+ if hist = [] then
+ printf
+ `"No stack trace is avaliable\n"
+ `"Recompile with -const \"Exn.keepHistory true\"\n" %
+ else
+ List.app (fn x => printf `"\t" `x `"\n" %) hist
+ end
+
+ fun ioExn (IO.Io { name, function = _, cause }) =
+ let
+ val reason =
+ case cause of
+ OS.SysErr (str, _) => str
+ | _ => exnMessage cause
+ in
+ eprintf `name `": " `reason `"\n" %
+ end
+ | ioExn _ = die 126 `"ioExn: unreachable\n" %
+
+ fun handler e = (
+ printf `"\n";
+ case e of
+ IO.Io _ => ioExn e
+ | _ => otherExn e;
+ exit 1
+ ) handle _ => sysExit 127
+end