diff --git a/dune-project b/dune-project index e1e4354..3b36e21 100644 --- a/dune-project +++ b/dune-project @@ -1,2 +1,3 @@ (lang dune 2.7) +(name xapi-backtrace) (cram enable) diff --git a/test/log.ml b/test/log.ml index 9ce569b..1a0bc00 100644 --- a/test/log.ml +++ b/test/log.ml @@ -39,17 +39,25 @@ let with_thread_associated_old desc f x = log_backtrace_exn exn bt ; raise exn -let with_thread_associated desc f x = - let print_backtrace = function - | Ok result -> - result - | Error (exn, bt) -> - output_log - (Printf.sprintf "%s failed with exception %s" desc - (Printexc.to_string exn) - ) ; - log_backtrace_exn exn bt ; - raise exn - in - let@ () = Backtrace.V2.with_backtraces ~finally:print_backtrace in +let rec with_thread_associated desc f x = + let@ () = Backtrace.V2.with_backtraces ~finally:(print_backtrace desc) in try f x with e -> Backtrace.is_important e ; raise e + +and print_backtrace desc = function + | Ok result -> + result + | Error ((Failure msg) as exn, bt) -> + (* stabilize output for Failure exceptions across compiler versions *) + output_log + (Printf.sprintf {|%s failed with exception Failure("%s")|} desc + msg + ) ; + log_backtrace_exn exn bt ; + raise exn + | Error (exn, bt) -> + output_log + (Printf.sprintf {|%s failed with exception %s|} desc + (Printexc.to_string exn) + ) ; + log_backtrace_exn exn bt ; + raise exn diff --git a/test/reraise.t b/test/reraise.t index 04831d1..a89c063 100644 --- a/test/reraise.t +++ b/test/reraise.t @@ -9,7 +9,7 @@ 1/4 raiser.exe Raised at file test/raiser.ml, line 1 2/4 raiser.exe Called from file test/raiser.ml, line 4 3/4 raiser.exe Called from file lib/backtrace.ml, line 251 - 4/4 raiser.exe Called from file test/log.ml, line 55 + 4/4 raiser.exe Called from file test/log.ml, line 44 $ ./raiser.exe -v1-with-backtrace @@ -23,5 +23,5 @@ 1/4 raiser.exe Raised at file test/raiser.ml, line 1 2/4 raiser.exe Called from file test/raiser.ml, line 6 3/4 raiser.exe Called from file test/raiser.ml, line 6 - 4/4 raiser.exe Called from file test/log.ml, line 55 + 4/4 raiser.exe Called from file test/log.ml, line 44