On Jul 6, 2014 8:15 AM, "Yuras Shumovich" <shumovichy@gmail.com> wrote:
>
> Hello,
>
> From docs: "If an exception is raised, then bracket will re-raise the
> exception (after performing the release)."
>
> But what if the release action will throw an exception? There are 3
> options:
>  1) suppress the exception from release action and rethrow the original
> one
>  2) shutdown the program
>  3) suppress the original exception and throw the exception from release
> action.
>
> Current behavior is #3 -- suppress the original exception. I think it
> the worse choice.
>
> What other languages do:
>
>  - java has try-with-resources statement which is the nearest equivalent
> of haskell's "bracket". It uses the option #1 (rethrow the original
> exception)
>
>  - in c++ it is common to use RAII for resource management, so someone's
> destructor performs resource cleanup. But if destructor throws exception
> during stack unrolling, the program is terminated (option #2)

You left off what I think is the best behavior, from Python 3:

4) Throw the exception for the release action, chaining the original exception to it. The default exception handler reports the them both.

> I prefer #2 because suppressing exception is a really bad idea. What is
> your choice?

#4.