Panic in OCaml

Our example demonstrates how to handle unexpected errors or critical situations in OCaml. While OCaml doesn’t have a direct equivalent to the panic concept, we can use exceptions to achieve similar behavior.

(* We'll use exceptions throughout this site to check for
   unexpected errors. This is the only program on the
   site designed to raise an exception. *)

exception Critical_error of string

let main () =
  (* Raise an exception with a message *)
  raise (Critical_error "a problem")

  (* A common use of exceptions is to abort if a function
     returns an error value that we don't know how to
     (or want to) handle. Here's an example of
     raising an exception if we get an unexpected error 
     when creating a new file. *)

  try
    let _ = open_out "/tmp/file" in
    ()
  with
  | Sys_error msg -> raise (Critical_error msg)

let () = main ()

Running this program will cause it to raise an exception, print an error message and stack trace, and exit with a non-zero status.

When the first exception in main is raised, the program exits without reaching the rest of the code. If you’d like to see the program try to create a temp file, comment out the first raise line.

$ ocaml panic.ml
Exception: Critical_error "a problem".

Note that unlike some languages which use exceptions for handling of many errors, in OCaml it is idiomatic to use result types (Result.t) for error handling wherever possible. Exceptions are typically reserved for truly exceptional situations.

OCaml provides a powerful pattern matching system that can be used with result types to handle errors gracefully. This approach is often preferred over raising exceptions for expected error conditions.