equal
deleted
inserted
replaced
12 end; |
12 end; |
13 |
13 |
14 signature EXN = |
14 signature EXN = |
15 sig |
15 sig |
16 include BASIC_EXN |
16 include BASIC_EXN |
|
17 val reraise: exn -> 'a |
17 datatype 'a result = Res of 'a | Exn of exn |
18 datatype 'a result = Res of 'a | Exn of exn |
18 val get_res: 'a result -> 'a option |
19 val get_res: 'a result -> 'a option |
19 val get_exn: 'a result -> exn option |
20 val get_exn: 'a result -> exn option |
20 val capture: ('a -> 'b) -> 'a -> 'b result |
21 val capture: ('a -> 'b) -> 'a -> 'b result |
21 val release: 'a result -> 'a |
22 val release: 'a result -> 'a |
29 val is_interrupt_exn: 'a result -> bool |
30 val is_interrupt_exn: 'a result -> bool |
30 val interruptible_capture: ('a -> 'b) -> 'a -> 'b result |
31 val interruptible_capture: ('a -> 'b) -> 'a -> 'b result |
31 val return_code: exn -> int -> int |
32 val return_code: exn -> int -> int |
32 val capture_exit: int -> ('a -> 'b) -> 'a -> 'b |
33 val capture_exit: int -> ('a -> 'b) -> 'a -> 'b |
33 exception EXCEPTIONS of exn list |
34 exception EXCEPTIONS of exn list |
|
35 val trace: (exn -> string) -> (string -> unit) -> (unit -> 'a) -> 'a |
34 end; |
36 end; |
35 |
37 |
36 structure Exn: EXN = |
38 structure Exn: EXN = |
37 struct |
39 struct |
|
40 |
|
41 (* reraise *) |
|
42 |
|
43 fun reraise exn = |
|
44 (case PolyML.exceptionLocation exn of |
|
45 NONE => raise exn |
|
46 | SOME location => PolyML.raiseWithLocation (exn, location)); |
|
47 |
38 |
48 |
39 (* user errors *) |
49 (* user errors *) |
40 |
50 |
41 exception ERROR of string; |
51 exception ERROR of string; |
42 |
52 |
73 | map_exn f (Exn e) = Exn (f e); |
83 | map_exn f (Exn e) = Exn (f e); |
74 |
84 |
75 |
85 |
76 (* interrupts *) |
86 (* interrupts *) |
77 |
87 |
78 exception Interrupt = Interrupt; |
88 exception Interrupt = SML90.Interrupt; |
79 |
89 |
80 fun interrupt () = raise Interrupt; |
90 fun interrupt () = raise Interrupt; |
81 |
91 |
82 fun is_interrupt Interrupt = true |
92 fun is_interrupt Interrupt = true |
83 | is_interrupt (IO.Io {cause, ...}) = is_interrupt cause |
93 | is_interrupt (IO.Io {cause, ...}) = is_interrupt cause |
103 |
113 |
104 (* concatenated exceptions *) |
114 (* concatenated exceptions *) |
105 |
115 |
106 exception EXCEPTIONS of exn list; |
116 exception EXCEPTIONS of exn list; |
107 |
117 |
|
118 |
|
119 (* low-level trace *) |
|
120 |
|
121 fun trace exn_message output e = |
|
122 PolyML.Exception.traceException |
|
123 (e, fn (trace, exn) => |
|
124 let |
|
125 val title = "Exception trace - " ^ exn_message exn; |
|
126 val () = output (String.concatWith "\n" (title :: trace)); |
|
127 in reraise exn end); |
|
128 |
108 end; |
129 end; |
109 |
130 |
110 datatype illegal = Interrupt; |
131 datatype illegal = Interrupt; |
111 |
132 |
112 structure Basic_Exn: BASIC_EXN = Exn; |
133 structure Basic_Exn: BASIC_EXN = Exn; |