An open API service indexing awesome lists of open source software.

https://github.com/slamko/ppx_catch

Ocaml PPX for no-exception error handling
https://github.com/slamko/ppx_catch

error-handling functional-programming meta-programming no-exception ocaml ppx ppx-extension ppx-rewriter ppxlib

Last synced: 3 months ago
JSON representation

Ocaml PPX for no-exception error handling

Awesome Lists containing this project

README

          

*** Simple PPX rewriter to catch exceptions and wrap the result into ('a, string) result
**** Overview

May be useful to handle the case when the function inside List.map fails:
#+begin_src ocaml
let%catch func lst =
List.map (fun x ->
if x > 0 then failwith "Some problem" else x + 1) lst
#+end_src

becomes:
#+begin_src ocaml
let%catch func lst =
try
Ok (List.map (fun x ->
if x > 0 then failwith "Some problem" else x + 1) lst)
with
| Failure err -> Error (*[ "func: " + err ]*) (* error messages with tracing *)
(* and so on *) ...
| _ -> Error "func: Unknown error"
#+end_src

Extension handles both top-level and "embedded" let bindings:
#+begin_src ocaml
let foo =
let%catch wants_to_raise () = (* wrap some Stdlib function for example *)
(* some logic *)
failwith "Stdlib exception" (* call to Stdlib function that raises an exception *)
in

wants_to_raise () (* returns ('a, string) result *)
#+end_src

Also works with "function" syntax:
#+begin_src ocaml
let%catch wrap_function = function
| Some res -> res
| None -> failwith "function syntax works too"
#+end_src

It basically wraps each case of the pattern matching.
#+begin_src ocaml
let () =
match wrap_function None with
| Ok ok -> Printf.printf "Ok\n" ;
| Error err -> Printf.printf "%s\n" err ;
()

#+end_src
prints :
#+begin_src sh
wrap_function: function syntax works too
#+end_src

**** Quickstart

To instal this rewriter as opam package:
#+begin_src sh
git clone https://github.com/slamko/ppx_catch.git &&
cd ppx_catch &&
dune build &&
opam install .
#+end_src

Now to use it in your project add ppx_catch to library list
and tell to use it as a preprocessor in your dune file:

#+begin_src lisp
(libraries
ppx_catch)
(preprocess (pps ppx_catch))
#+end_src

For a complete dune file example see test/dune

**** LICENSE
GPL-v3.0