Many try/except/finally-clauses not only “uglify” my code, but i find myself often using identical exception-handling for similar tasks. So i was considering reducing redundancy by “outsourcing” them to a … decorator.
Because i was sure not to be the 1st one to come to this conclusion, I googled and found this – imho – ingenious recipe which added the possibility to handle more than one exception.
But i was surprised why this doesn’t seem to be a wide known and used practice per se, so i was wondering if there is maybe an aspect i wasn’t considering?
-
Is it bogus to use the decorator pattern for exception-handling or did i just miss it the whole time? Please enlighten me! What are the pitfalls?
-
Is there maybe even a package/module out there which supports the creation of such exception-handling in a reasonable way?
The biggest reason to keep the try/except/finally blocks in the code itself is that error recovery is usually an integral part of the function.
For example, if we had our own
int()function:What should we do if
textcannot be converted? Return0? ReturnNone?If you have many simple cases then I can see a simple decorator being useful, but I think the recipe you linked to tries to do too much: it allows a different function to be activated for each possible exception–in cases such as those (several different exceptions, several different code paths) I would recommend a dedicated wrapper function.
Here’s my take on a simple decorator approach:
and sample usage: