File: backtrace_or_exception.ml

package info (click to toggle)
ocaml 5.4.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,372 kB
  • sloc: ml: 370,196; ansic: 52,820; sh: 27,396; asm: 5,462; makefile: 3,679; python: 974; awk: 278; javascript: 273; perl: 59; fortran: 21; cs: 9
file content (53 lines) | stat: -rw-r--r-- 972 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
(* TEST_BELOW
(* Blank lines added here to preserve locations. *)

*)

exception Exn

let return_exn ?(raise_it_instead=false) () =
  if raise_it_instead then
    raise Exn
  else
    Exn
[@@inline never]

let without_reraise () =
  match return_exn () with
  | Exn as exn
  | exception (Exn as exn) ->
    raise exn
  | _ -> assert false

let with_reraise () =
  match return_exn ~raise_it_instead:true () with
  | Exn as exn
  | exception (Exn as exn) ->
    raise exn
  | _ -> assert false

let trickier () =
  try raise Not_found
  with e ->
    match return_exn () with
    | Exn as exn
    | exception (Exn as exn) ->
      raise exn
    | _ -> assert false

let run f =
  try f ()
  with exn ->
    Printf.printf "exception %s\n" (Printexc.to_string exn);
    Printexc.print_backtrace stdout;
    Printf.printf "---------------------------\n%!"

let _ =
  run without_reraise;
  run with_reraise;
  run trickier

(* TEST
 flags = "-g";
 ocamlrunparam += ",b=1";
*)