18-07-2009, 02:59 Steven D'Aprano <steve@pearwood.info> wrote:
On Sat, 18 Jul 2009 09:41:10 am Michael wrote:
Here are two examples of why allowing return inside a finally block is a bad idea:
def f(): try: return 3 finally: return 4
Given that the finally block is guaranteed to run after exiting the try block, I don't see anything objectionable about that. Surprising, perhaps, possibly even an artifact of the CPython implementation, but why is it a "bad idea" that needs to be protected against?
def f(): try: raise Exception() finally: return 4
That's no weirder than:
def f(): try: raise Exception() except Exception: return 4
or:
def f(): try: raise Exception() except Exception: pass return 4
The problem is that finally clause is not for catching exceptions but for doing clean-up actions. And here finally-clause *stops* propagation of any exception! (also from lower levels!) def f() try: raise KeyError except KeyError: raise Exception finally: return 4 ...returns 4 without obstacles! It's weird and missleading. I thing it's definitely a bug. -- Jan Kaliszewski <zuo@chopin.edu.pl>