e.printStackTrace equivalent in python
Solution 1
import traceback
traceback.print_exc()
When doing this inside an except ...:
block it will automatically use the current exception. See http://docs.python.org/library/traceback.html for more information.
Solution 2
There is also logging.exception
.
import logging
...
try:
g()
except Exception as ex:
logging.exception("Something awful happened!")
# will print this message followed by traceback
Output:
ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
File "b.py", line 22, in f
g()
File "b.py", line 14, in g
1/0
ZeroDivisionError: integer division or modulo by zero
(From http://blog.tplus1.com/index.php/2007/09/28/the-python-logging-module-is-much-better-than-print-statements/ via How to print the full traceback without halting the program?)
Solution 3
e.printStackTrace equivalent in python
In Java, this does the following (docs):
public void printStackTrace()
Prints this throwable and its backtrace to the standard error stream...
This is used like this:
try
{
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}
In Java, the Standard Error stream is unbuffered so that output arrives immediately.
The same semantics in Python 2 are:
import traceback
import sys
try: # code that may raise an error
pass
except IOError as e: # exception handling
# in Python 2, stderr is also unbuffered
print >> sys.stderr, traceback.format_exc()
# in Python 2, you can also from __future__ import print_function
print(traceback.format_exc(), file=sys.stderr)
# or as the top answer here demonstrates, use:
traceback.print_exc()
# which also uses stderr.
Python 3
In Python 3, we can get the traceback directly from the exception object (which likely behaves better for threaded code). Also, stderr is line-buffered, but the print function gets a flush argument, so this would be immediately printed to stderr:
print(traceback.format_exception(None, # <- type(e) by docs, but ignored
e, e.__traceback__),
file=sys.stderr, flush=True)
Conclusion:
In Python 3, therefore, traceback.print_exc()
, although it uses sys.stderr
by default, would buffer the output, and you may possibly lose it. So to get as equivalent semantics as possible, in Python 3, use print
with flush=True
.
Solution 4
Adding to the other great answers, we can use the Python logging
library's debug()
, info()
, warning()
, error()
, and critical()
methods. Quoting from the docs for Python 3.7.4,
There are three keyword arguments in kwargs which are inspected: exc_info which, if it does not evaluate as false, causes exception information to be added to the logging message.
What this means is, you can use the Python logging
library to output a debug()
, or other type of message, and the logging
library will include the stack trace in its output. With this in mind, we can do the following:
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def f():
a = { 'foo': None }
# the following line will raise KeyError
b = a['bar']
def g():
f()
try:
g()
except Exception as e:
logger.error(str(e), exc_info=True)
And it will output:
'bar'
Traceback (most recent call last):
File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
g()
File "<ipython-input-2-8ae09e08766b>", line 14, in g
f()
File "<ipython-input-2-8ae09e08766b>", line 10, in f
b = a['bar']
KeyError: 'bar'
Related videos on Youtube
Comments
-
koool almost 2 years
I know that
print(e)
(where e is an Exception) prints the occurred exception but, I was trying to find the python equivalent of Java'se.printStackTrace()
that exactly traces the exception to what line it occurred and prints the entire trace of it.Could anyone please tell me the equivalent of
e.printStackTrace()
in Python? -
Seldom 'Where's Monica' Needy over 7 yearsIf you're working inside some kind of container such as Jython and therefore cannot just print the trace, you can
format_exc
instead to get a string. -
Nathan over 4 yearsWhat are the advantages/disadvantages of this versus
traceback.print_exc()
? -
Governa over 3 yearsThe biggest advantage is that you may control what/where you want to see by configuring your logger. You could, for example, use it to send the log to a logging service in production so that it is easier to fix difficult to reproduce problems.
-
Joe Sadoski over 2 years
logger.error(str(e), exc_info=True)
could be better expressed aslogger.exception()