log exceptions that occur to a local file

This commit is contained in:
2025-08-04 06:23:52 +01:00
parent 528aea59a1
commit 83634ef20e
3 changed files with 40 additions and 15 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
shf shf
shf-tests shf-tests
exceptions.log

View File

@@ -229,9 +229,7 @@ struct
end end
fun yank (shellState: t, str) = fun yank (shellState: t, str) =
( Glfw.setClipboardString (#window shellState, str); (Glfw.setClipboardString (#window shellState, str); shellState)
shellState
)
fun consumeDrawEvent (shellState, msg) = fun consumeDrawEvent (shellState, msg) =
let let

View File

@@ -2,6 +2,7 @@ structure UpdateThread =
struct struct
open CML open CML
open MailboxType open MailboxType
open InputMsg
fun sendMsg (msg, drawMailbox) = fun sendMsg (msg, drawMailbox) =
case msg of DRAW msg => Mailbox.send (drawMailbox, msg) case msg of DRAW msg => Mailbox.send (drawMailbox, msg)
@@ -14,22 +15,47 @@ struct
end end
| [] => () | [] => ()
fun loop (app: AppType.app_type, inputMailbox, drawMailbox) = val textCommands = ref ""
fun addTextCommand inputMsg =
case inputMsg of
CHAR_EVENT chr =>
let let
val inputMsg = Mailbox.recv inputMailbox val chr = CharVector.fromList [chr]
val app = val newInput = !textCommands ^ chr
AppUpdate.update (app, inputMsg) in
handle e => textCommands := newInput
end
| _ => ()
fun handleException e =
let let
(* print stack trace for debugging purposes, (* print stack trace for debugging purposes,
* and then raise another exception to exit the program *) * and then raise another exception to exit the program *)
val stackTrace = MLton.Exn.history e val stackTrace = MLton.Exn.history e
val stackTrace = String.concatWith "\n" stackTrace val stackTrace = String.concatWith "\n" stackTrace
val () = print (stackTrace ^ "\n") val () = print "ERROR:\n"
val () = print (stackTrace ^ "\n\n")
val history = !textCommands ^ "\n\n"
val () = print ("HISTORY: " ^ history)
val textOutput = stackTrace ^ "\n" ^ history
val io = TextIO.openAppend "exceptions.log"
val () = TextIO.output (io, textOutput)
val () = TextIO.closeOut io
in in
raise Empty raise Empty
end end
fun loop (app: AppType.app_type, inputMailbox, drawMailbox) =
let
val inputMsg = Mailbox.recv inputMailbox
val () = addTextCommand inputMsg
val app = AppUpdate.update (app, inputMsg) handle e => handleException e
val () = sendMsgs (#msgs app, drawMailbox) val () = sendMsgs (#msgs app, drawMailbox)
in in
loop (app, inputMailbox, drawMailbox) loop (app, inputMailbox, drawMailbox)