Safe

The Safe effect is useful to handle resources which must be closed even in the presence of exceptions. The main operations are

Let’s see an example for the protection of a resource: ``

> Results
Without exception: Right(55), finalizers exceptions: no exceptions, resource is closed: true
With exception   : Left(boo), finalizers exceptions: no exceptions, resource is closed: true

As you can see in the signature of program the return value of runSafe is (Throwable Either A, List[Throwable]). The first part is the result of your program, which may end with an exception, and the second part is the list of possible exceptions thrown by the finalizers which can themselves fail.

A simpler version of bracket is finally.

This example show how to use finally but also what happens if a finalizer fails:``

> Results
Computation ok, finalizer ok: Right(55), finalizers exceptions: no exceptions
Computation ok, finalizer ko: Right(55), finalizers exceptions: List(failed!!)
Computation ko, finalizer ok: Left(boo), finalizers exceptions: no exceptions
Computation ko, finalizer ko: Left(boo), finalizers exceptions: List(failed!!)

Finally (no pun intended!) note that you can use execSafe if you are not interested in the result of the finalizers.