Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the last exception object after an error is raised at a Python prompt?

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.

like image 517
Ben Hoyt Avatar asked Mar 25 '13 00:03

Ben Hoyt


People also ask

How do I find exception errors in Python?

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.

How do you handle a raised exception in Python?

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.

What happens after raise exception in Python?

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.

Does raising an exception stop the program Python?

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.


2 Answers

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.

like image 114
Cairnarvon Avatar answered Oct 11 '22 08:10

Cairnarvon


As @Cairnarvon mentioned, I didn't find any last_valuemember 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 
like image 44
Kumar Sambhav Pandey Avatar answered Oct 11 '22 08:10

Kumar Sambhav Pandey