From 220dd80a2671f57486055955d5422163cf73ed33 Mon Sep 17 00:00:00 2001 From: Irit Katriel Date: Sat, 22 May 2021 17:39:33 +0100 Subject: bpo-33809: add the TracebackException.print() method (GH-24231) --- Doc/library/traceback.rst | 7 +++++++ Lib/test/test_traceback.py | 17 +++++++++++++++++ Lib/traceback.py | 12 ++++++++---- .../Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst | 2 ++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index e938dd5..bd53bc0 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -271,6 +271,13 @@ capture data for later printing in a lightweight fashion. Note that when locals are captured, they are also shown in the traceback. + .. method:: print(*, file=None, chain=True) + + Print to *file* (default ``sys.stderr``) the exception information returned by + :meth:`format`. + + .. versionadded:: 3.11 + .. method:: format(*, chain=True) Format the exception. diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 5bd969d..e9df1ce 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -1378,6 +1378,23 @@ class TestTracebackException(unittest.TestCase): exc = traceback.TracebackException(Exception, Exception("haven"), None) self.assertEqual(list(exc.format()), ["Exception: haven\n"]) + def test_print(self): + def f(): + x = 12 + try: + x/0 + except Exception: + return sys.exc_info() + exc = traceback.TracebackException(*f(), capture_locals=True) + output = StringIO() + exc.print(file=output) + self.assertEqual( + output.getvalue().split('\n')[-4:], + [' x/0', + ' x = 12', + 'ZeroDivisionError: division by zero', + '']) + class MiscTest(unittest.TestCase): diff --git a/Lib/traceback.py b/Lib/traceback.py index 8f908dd..e19745d 100644 --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -111,11 +111,8 @@ def print_exception(exc, /, value=_sentinel, tb=_sentinel, limit=None, \ position of the error. """ value, tb = _parse_value_tb(exc, value, tb) - if file is None: - file = sys.stderr te = TracebackException(type(value), value, tb, limit=limit, compact=True) - for line in te.format(chain=chain): - print(line, file=file, end="") + te.print(file=file, chain=chain) def format_exception(exc, /, value=_sentinel, tb=_sentinel, limit=None, \ @@ -669,3 +666,10 @@ class TracebackException: yield 'Traceback (most recent call last):\n' yield from exc.stack.format() yield from exc.format_exception_only() + + def print(self, *, file=None, chain=True): + """Print the result of self.format(chain=chain) to 'file'.""" + if file is None: + file = sys.stderr + for line in self.format(chain=chain): + print(line, file=file, end="") diff --git a/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst b/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst new file mode 100644 index 0000000..a8a550d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst @@ -0,0 +1,2 @@ +Add the :meth:`traceback.TracebackException.print` method which prints +the formatted exception information. -- cgit v0.12