Base.Exn
Exceptions.
sexp_of_t
uses a global table of sexp converters. To register a converter for a new exception, add [@@deriving sexp]
to its definition. If no suitable converter is found, the standard converter in Printexc
will be used to generate an atomic S-expression.
include Pretty_printer.S with type t := t
val pp : Formatter.t -> t -> unit
Raised when finalization after an exception failed, too. The first exception argument is the one raised by the initial function, the second exception the one raised by the finalizer.
exception Reraised of string * t
create_s sexp
returns an exception t
such that phys_equal (sexp_of_t t) sexp
. This is useful when one wants to create an exception that serves as a message and the particular exn constructor doesn't matter.
val raise_without_backtrace : t -> _
Same as raise
, except that the backtrace is not recorded.
val reraise : t -> string -> _
Types with format4
are hard to read, so here's an example.
let foobar str =
try
...
with exn ->
Exn.reraisef exn "Foobar is buggy on: %s" str ()
val to_string : t -> string
Human-readable, multi-line.
val to_string_mach : t -> string
Machine format, single-line.
Executes f
and afterwards executes finally
, whether f
throws an exception or not.
handle_uncaught ~exit f
catches an exception escaping f
and prints an error message to stderr. Exits with return code 1 if exit
is true
, and returns unit otherwise.
Note that since OCaml 4.02.0, you don't need to use this at the entry point of your program, as the OCaml runtime will do better than this function.
handle_uncaught_and_exit f
returns f ()
, unless that raises, in which case it prints the exception and exits nonzero.
Traces exceptions passing through. Useful because in practice, backtraces still don't seem to work.
Example:
let rogue_function () = if Random.bool () then failwith "foo" else 3
let traced_function () = Exn.reraise_uncaught "rogue_function" rogue_function
traced_function ();;
: Program died with Reraised("rogue_function", Failure "foo")
does_raise f
returns true
iff f ()
raises, which is often useful in unit tests.