Both the following snippets of code do the same thing. They catch every exception and execute the code in the except: block
Snippet 1 –
try:
#some code that may throw an exception
except:
#exception handling code
Snippet 2 –
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
What is exactly the difference in both the constructs?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
In the second you can access the attributes of the exception object:
>>> def catch():
... try:
... asd()
... except Exception as e:
... print e.message, e.args
...
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)
But it doesn’t catch BaseException or the system-exiting exceptions SystemExit, KeyboardInterrupt and GeneratorExit:
>>> def catch(): ... try: ... raise BaseException() ... except Exception as e: ... print e.message, e.args ... >>> catch() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in catch BaseException
Which a bare except does:
>>> def catch(): ... try: ... raise BaseException() ... except: ... pass ... >>> catch() >>>
See the Built-in Exceptions section of the docs and the Errors and Exceptions section of the tutorial for more info.
Method 2
except:
accepts all exceptions, whereas
except Exception as e:
only accepts exceptions that you’re meant to catch.
Here’s an example of one that you’re not meant to catch:
>>> try: ... input() ... except: ... pass ... >>> try: ... input() ... except Exception as e: ... pass ... Traceback (most recent call last): File "<stdin>", line 2, in <module> KeyboardInterrupt
The first one silenced the KeyboardInterrupt!
Here’s a quick list:
issubclass(BaseException, BaseException) #>>> True issubclass(BaseException, Exception) #>>> False issubclass(KeyboardInterrupt, BaseException) #>>> True issubclass(KeyboardInterrupt, Exception) #>>> False issubclass(SystemExit, BaseException) #>>> True issubclass(SystemExit, Exception) #>>> False
If you want to catch any of those, it’s best to do
except BaseException:
to point out that you know what you’re doing.
All exceptions stem from BaseException, and those you’re meant to catch day-to-day (those that’ll be thrown for the programmer) inherit too from Exception.
Method 3
There are differences with some exceptions, e.g. KeyboardInterrupt.
Reading PEP8:
A bare except: clause will catch SystemExit and KeyboardInterrupt
exceptions, making it harder to interrupt a program with Control-C,
and can disguise other problems. If you want to catch all exceptions
that signal program errors, use except Exception: (bare except is
equivalent to except BaseException:).
Method 4
Another way to look at this. Check out the details of the exception:
In [49]: try:
...: open('file.DNE.txt')
...: except Exception as e:
...: print(dir(e))
...:
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']
There are lots of “things” to access using the ‘as e’ syntax.
This code was solely meant to show the details of this instance.
Method 5
Using the second snippet gives you a variable (named based upon the as clause, in your example e) in the except block scope with the exception object bound to it so you can use the information in the exception (type, message, stack trace, etc) to handle the exception in a more specially tailored manor.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0