summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIrit Katriel <iritkatriel@yahoo.com>2021-05-22 16:39:33 (GMT)
committerGitHub <noreply@github.com>2021-05-22 16:39:33 (GMT)
commit220dd80a2671f57486055955d5422163cf73ed33 (patch)
tree04cc9fcda487050f9978e42f6682d6a51a92f8ec
parent9e746e3298da36f4e8df0495f91a720f3e54ea33 (diff)
downloadcpython-220dd80a2671f57486055955d5422163cf73ed33.zip
cpython-220dd80a2671f57486055955d5422163cf73ed33.tar.gz
cpython-220dd80a2671f57486055955d5422163cf73ed33.tar.bz2
bpo-33809: add the TracebackException.print() method (GH-24231)
-rw-r--r--Doc/library/traceback.rst7
-rw-r--r--Lib/test/test_traceback.py17
-rw-r--r--Lib/traceback.py12
-rw-r--r--Misc/NEWS.d/next/Library/2021-01-16-18-36-00.bpo-33809.BiMK6V.rst2
4 files changed, 34 insertions, 4 deletions
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.