Get exception description and stack trace which caused an exception, all as a string
See the traceback
module, specifically the format_exc()
function. Here.
import tracebacktry: raise ValueErrorexcept ValueError: tb = traceback.format_exc()else: tb = "No error"finally: print tb
Let's create a decently complicated stacktrace, in order to demonstrate that we get the full stacktrace:
def raise_error(): raise RuntimeError('something bad happened!')def do_something_that_might_error(): raise_error()
Logging the full stacktrace
A best practice is to have a logger set up for your module. It will know the name of the module and be able to change levels (among other attributes, such as handlers)
import logginglogging.basicConfig(level=logging.DEBUG)logger = logging.getLogger(__name__)
And we can use this logger to get the error:
try: do_something_that_might_error()except Exception as error: logger.exception(error)
Which logs:
ERROR:__main__:something bad happened!Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 2, in do_something_that_might_error File "<stdin>", line 2, in raise_errorRuntimeError: something bad happened!
And so we get the same output as when we have an error:
>>> do_something_that_might_error()Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in do_something_that_might_error File "<stdin>", line 2, in raise_errorRuntimeError: something bad happened!
Getting just the string
If you really just want the string, use the traceback.format_exc
function instead, demonstrating logging the string here:
import tracebacktry: do_something_that_might_error()except Exception as error: just_the_string = traceback.format_exc() logger.debug(just_the_string)
Which logs:
DEBUG:__main__:Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 2, in do_something_that_might_error File "<stdin>", line 2, in raise_errorRuntimeError: something bad happened!
With Python 3, the following code will format an Exception
object exactly as would be obtained using traceback.format_exc()
:
import tracebacktry: method_that_can_raise_an_exception(params)except Exception as ex: print(''.join(traceback.format_exception(etype=type(ex), value=ex, tb=ex.__traceback__)))
The advantage being that only the Exception
object is needed (thanks to the recorded __traceback__
attribute), and can therefore be more easily passed as an argument to another function for further processing.