Make2.ExnInteracting between monads and language exceptions
val expect :
?finally:(unit -> (unit, 's) T2(M).t) ->
f:(unit -> ('a, 's) T2(M).t) ->
catch:(exn -> ('a, 's) T2(M).t) ->
('a, 's) T2(M).texpect ?finally ~f ~catch evaluates f (), if an exception e is raised during the evaluation (or call) then the result of whole computation will be catch e. If an optional argument ?finally is passed the finally is called after f () computation or after catch e if an exception was raised.