On Friday, April 10, 2015 at 2:18:22 PM UTC+5:30, Pavel S wrote: > Hi, > > I noticed interesting behaviour. Since I don't have python3 installation > here, I tested that on Python 2.7. > > Well known feature is that try..except block can catch multiple exceptions > listed in a tuple: > > > exceptions = ( TypeError, ValueError ) > > try: > a, b = None > except exceptions, e: > print 'Catched error:', e > > > However when exceptions=(), then try..except block behaves as no try..except > block. > > > exceptions = () > > try: > a, b = None # <--- the error will not be catched > except exceptions, e: > print 'Catched error:', e > > > I found use case for it, e.g. when I want to have a method with 'exceptions' > argument: > > > def catch_exceptions(exceptions=()): > try: > do_something() > except exceptions: > do_something_else() > > > catch_exceptions() # catches nothing > catch_exceptions((TypeError,)) # catches TypeError > > > I believe that behaviour is not documented. What you think?
As others have pointed out: "You asked for it; you got it; what's the issue?" Nevertheless a tentative +1 from me on the suggestions ∵ except : catches everything except (): catches nothing --- which is brittle to say the least. Also given this sort of lines in the docs (2.7 tutorial): ----------------------------- ... except (RuntimeError, TypeError, NameError): ... pass Note that the parentheses around this tuple are required, because except ValueError, e: was the syntax used for what is normally written as except ValueError as e: in modern Python (described below). The old syntax is still supported for backwards compatibility. This means except RuntimeError, TypeError is not equivalent to except (RuntimeError, TypeError): but to except RuntimeError as TypeError: which is not what you want. ------------------------------------ there's already some versioning related brittleness around except. -- https://mail.python.org/mailman/listinfo/python-list