When debugging Python code at the interactive prompt (REPL), often I'll write some code which raises an exception, but I haven't wrapped it in a try
/except
, so once the error is raised, I've forever lost the exception object.
Often the traceback and error message Python prints out isn't enough. For example, when fetching a URL, the server might return a 40x error, and you need the content of the response via error.read()
... but you haven't got the error object anymore. For example:
>>> import urllib2 >>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string') Traceback (most recent call last): File "<stdin>", line 1, in <module> ... urllib2.HTTPError: HTTP Error 400: Bad Request
Drat, what did the body of the response say? It probably had valuable error information in it...
I realize it's usually easy to re-run your code wrapped in a try/except, but that's not ideal. I also realize that in this specific case if I were using the requests
library (which doesn't raise for HTTP errors), I wouldn't have this problem ... but I'm really wondering if there's a more general way to get the last exception object at a Python prompt in these cases.
If you want the error class, error message, and stack trace, use sys. exc_info() . The function sys. exc_info() gives you details about the most recent exception.
In Python, exceptions can be handled using a try statement. The critical operation which can raise an exception is placed inside the try clause. The code that handles the exceptions is written in the except clause. We can thus choose what operations to perform once we have caught the exception.
When an exception is raised, no further statements in the current block of code are executed. Unless the exception is handled (described below), the interpreter will return directly to the interactive read-eval-print loop, or terminate entirely if Python was started with a file argument.
except block is completed and the program will proceed. However, if an exception is raised in the try clause, Python will stop executing any more code in that clause, and pass the exception to the except clause to see if this particular error is handled there.
The sys
module provides some functions for post-hoc examining of exceptions: sys.last_type
, sys.last_value
, and sys.last_traceback
.
sys.last_value
is the one you're looking for.
As @Cairnarvon mentioned, I didn't find any last_value
member is sys module.
sys.exc_info()
did the trick for me. sys.exc_info()
returns a tuple with three values (type, value, traceback)
.
So sys.exc_info()[1]
will give the readable error. Here is the example,
import sys list = [1,2,3,4] try: del list[8] except Exception: print(sys.exc_info()[1])
will output list assignment index out of range
Also, traceback.format_exc()
from traceback
module can be used to print out the similar information.
Below is the output if format_exec()
is used,
Traceback (most recent call last): File "python", line 6, in <module> IndexError: list assignment index out of range
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With