diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 3dfda5cb956636..c54854eeb5ad22 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -624,6 +624,14 @@ def test_notimplemented_type(self): def test_none_type(self): self.assertIsInstance(None, types.NoneType) + def test_traceback_and_frame_types(self): + try: + raise OSError + except OSError as e: + exc = e + self.assertIsInstance(exc.__traceback__, types.TracebackType) + self.assertIsInstance(exc.__traceback__.tb_frame, types.FrameType) + class UnionTests(unittest.TestCase): diff --git a/Lib/types.py b/Lib/types.py index 679c7f638b3100..9490da7b9ee3b9 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -52,11 +52,9 @@ def _m(self): pass try: raise TypeError -except TypeError: - tb = sys.exc_info()[2] - TracebackType = type(tb) - FrameType = type(tb.tb_frame) - tb = None; del tb +except TypeError as exc: + TracebackType = type(exc.__traceback__) + FrameType = type(exc.__traceback__.tb_frame) # For Jython, the following two types are identical GetSetDescriptorType = type(FunctionType.__code__) diff --git a/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst b/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst new file mode 100644 index 00000000000000..b416a1692270b0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-01-25-10-59-41.bpo-46510.PM5svI.rst @@ -0,0 +1,3 @@ +Add missing test for :class:`types.TracebackType` and +:class:`types.FrameType`. Calculate them directly from the caught exception +without calling :func:`sys.exc_info`.