[Python-Dev] Handle errors in cleanup code
Martin (gzlist)
gzlist at googlemail.com
Mon Jun 12 03:31:02 EDT 2017
On 12/06/2017, Serhiy Storchaka <storchaka at gmail.com> wrote:
>
> But if an error is raised when execute undo_something(), it replaces the
> original exception which become chaining as the __context__ attribute.
> The problem is that this can change the type of the exception. If
> do_something_other() raises SystemExit and undo_something() raises
> KeyError, the final exception has type KeyError.
For Python 2.7, I've used the following idiom, which always masks
errors from the undo:
do_something()
try:
do_something_other()
except:
try:
undo_something()
finally:
raise
Unfortunately, that breaks down on Python 3, as the new exception
propogates with the original as context..
> Does it mean that we should rewrite every chunk of code similar to the
> above? And if such cumbersome code is necessary and become common, maybe
> it needs syntax support in the language? Or changing the semantic of
> exceptions raised in error handlers and finally blocks?
What I want is a way to chain exceptions in the other direction,
raising the original error, but attaching a related one. Unfortunately
neither __cause__ or __context__ really help.
Martin
More information about the Python-Dev
mailing list