diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2012-10-31 23:49:19 (GMT) |
---|---|---|
committer | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2012-10-31 23:49:19 (GMT) |
commit | d06d5403de5409be3db7c8218ecd8400cd94f40d (patch) | |
tree | e828245e5e936a85f8a74655198fd3d1b3064940 /Lib/logging/__init__.py | |
parent | a889d801edab20b70dc8aba33763d76e82568250 (diff) | |
download | cpython-d06d5403de5409be3db7c8218ecd8400cd94f40d.zip cpython-d06d5403de5409be3db7c8218ecd8400cd94f40d.tar.gz cpython-d06d5403de5409be3db7c8218ecd8400cd94f40d.tar.bz2 |
Closes #16366: Improve diagnostics from handleError(). Thanks to Antoine Pitrou for the suggestion.
Diffstat (limited to 'Lib/logging/__init__.py')
-rw-r--r-- | Lib/logging/__init__.py | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 0f804ae..9242023 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -879,16 +879,27 @@ class Handler(Filterer): The record which was being processed is passed in to this method. """ if raiseExceptions and sys.stderr: # see issue 13807 - ei = sys.exc_info() + t, v, tb = sys.exc_info() try: - traceback.print_exception(ei[0], ei[1], ei[2], - None, sys.stderr) - sys.stderr.write('Logged from file %s, line %s\n' % ( - record.filename, record.lineno)) + sys.stderr.write('--- Logging error ---\n') + traceback.print_exception(t, v, tb, None, sys.stderr) + sys.stderr.write('Call stack:\n') + # Walk the stack frame up until we're out of logging, + # so as to print the calling context. + frame = tb.tb_frame + while (frame and os.path.dirname(frame.f_code.co_filename) == + __path__[0]): + frame = frame.f_back + if frame: + traceback.print_stack(frame, file=sys.stderr) + else: + # couldn't find the right stack frame, for some reason + sys.stderr.write('Logged from file %s, line %s\n' % ( + record.filename, record.lineno)) except IOError: #pragma: no cover pass # see issue 5971 finally: - del ei + del t, v, tb class StreamHandler(Handler): """ |