Get exception description and stack trace which caused an exception, all as a string Get exception description and stack trace which caused an exception, all as a string python python

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.