src/Pure/RAW/exn.ML
changeset 62505 9e2a65912111
parent 62492 0e53fade87fe
equal deleted inserted replaced
62504:f14f17e656a6 62505:9e2a65912111
    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;