How can I get the traceback object ( sys.exc_info()[2] , same as sys.exc_traceback ) as a string?
Asked Answered
D

2

10

I have a function which catches all exceptions, and I want to be able to get the traceback as a string within this function.

So far this is not working:

def handle_errors(error_type, error_message, error_traceback):
    """catch errors"""
    import traceback
    error = {}
    error['type'] = error_type.__name__
    error['message'] = str(error_message)
    error['file'] = os.path.split(error_traceback.tb_frame.f_code.co_filename)[1]
    error['line'] = error_traceback.tb_lineno
    error['traceback'] = repr(traceback.print_tb(error_traceback))
    ### finalise error handling and exit ###

sys.excepthook = handle_errors

It's the error['traceback'] line which is wrong. Do i even need to use the traceback module?

As per this other vaguely similar question, I have tried:

error['traceback'] = repr(error_traceback.print_exc())

...but this gives an error:

Error in sys.excepthook:
Traceback (most recent call last):
  File "xxxxxxxxxxx", line 54, in handle_errors
    error['traceback'] = repr(error_traceback.print_exc())
AttributeError: 'traceback' object has no attribute 'print_exc'
Dialectology answered 27/11, 2013 at 11:39 Comment(7)
possible duplicate of Get full tracebackDowd
that question is not applicable. i will update my question explaining whyDialectology
Hello. See my answer please. Why did you wrote that your question isn't applicable ?Affective
@Affective because that other question is not about capturing a traceback within an excepthook function. the excepthook function provides a traceback frame to query (error_traceback) but that other question does not address how to use this frame.Dialectology
I don't understand what you say because of "that other question" ? Which other question ??Affective
Besides, I remark something I didn't until now: in the definition of handle_errors, the reference error['traceback'] is assigned to repr() of traceback.print_tb(error_traceback)) while the account of the exception says it is repr() of error_traceback.print_exc())Affective
to see the other question i am talking about, please click on the link-words 'that other question' in my previous comment. its the one which you have put This question may already have an answer here: at the top of my original postDialectology
C
19

Use traceback.format_tb() instead of print_tb() to get the formatted stack trace (as a list of lines):

error['traceback'] = ''.join(traceback.format_tb(error_traceback))

print_tb() directly prints the traceback, that's why you get None as a result (that's the default for any Python function that doesn't return anything explicitely).

Caputo answered 27/11, 2013 at 11:50 Comment(1)
Your answer led me to the precise solution.Affective
A
0

traceback.format_exc([limit])
This is like print_exc(limit) but returns a string instead of printing to a file.

New in version 2.4.

error['traceback'] = traceback.format_exc(error_traceback)
Affective answered 12/12, 2013 at 14:33 Comment(1)
This does not work due to reasons pointed out by Lukas G. in the accepted answer that was posted earlier than yours.Allotrope

© 2022 - 2024 — McMap. All rights reserved.