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
- Host: GitHub
- URL: https://github.com/slamko/ppx_catch
- Owner: slamko
- License: gpl-3.0
- Created: 2023-07-26T19:04:10.000Z (about 2 years ago)
- Default Branch: master
- Last Pushed: 2023-07-27T13:30:44.000Z (about 2 years ago)
- Last Synced: 2025-03-14T21:41:43.760Z (7 months ago)
- Topics: error-handling, functional-programming, meta-programming, no-exception, ocaml, ppx, ppx-extension, ppx-rewriter, ppxlib
- Language: OCaml
- Homepage:
- Size: 17.5 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.org
- License: LICENSE
Awesome Lists containing this project
README
*** Simple PPX rewriter to catch exceptions and wrap the result into ('a, string) result
**** OverviewMay 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_srcbecomes:
#+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_srcExtension 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 *)
inwants_to_raise () (* returns ('a, string) result *)
#+end_srcAlso works with "function" syntax:
#+begin_src ocaml
let%catch wrap_function = function
| Some res -> res
| None -> failwith "function syntax works too"
#+end_srcIt 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_srcNow 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_srcFor a complete dune file example see test/dune
**** LICENSE
GPL-v3.0