xref: /third_party/python/Lib/test/test_raise.py (revision 7db96d56)
17db96d56Sopenharmony_ci# Copyright 2007 Google, Inc. All Rights Reserved.
27db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement.
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci"""Tests for the raise statement."""
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cifrom test import support
77db96d56Sopenharmony_ciimport sys
87db96d56Sopenharmony_ciimport types
97db96d56Sopenharmony_ciimport unittest
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cidef get_tb():
137db96d56Sopenharmony_ci    try:
147db96d56Sopenharmony_ci        raise OSError()
157db96d56Sopenharmony_ci    except OSError as e:
167db96d56Sopenharmony_ci        return e.__traceback__
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciclass Context:
207db96d56Sopenharmony_ci    def __enter__(self):
217db96d56Sopenharmony_ci        return self
227db96d56Sopenharmony_ci    def __exit__(self, exc_type, exc_value, exc_tb):
237db96d56Sopenharmony_ci        return True
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciclass TestRaise(unittest.TestCase):
277db96d56Sopenharmony_ci    def test_invalid_reraise(self):
287db96d56Sopenharmony_ci        try:
297db96d56Sopenharmony_ci            raise
307db96d56Sopenharmony_ci        except RuntimeError as e:
317db96d56Sopenharmony_ci            self.assertIn("No active exception", str(e))
327db96d56Sopenharmony_ci        else:
337db96d56Sopenharmony_ci            self.fail("No exception raised")
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci    def test_reraise(self):
367db96d56Sopenharmony_ci        try:
377db96d56Sopenharmony_ci            try:
387db96d56Sopenharmony_ci                raise IndexError()
397db96d56Sopenharmony_ci            except IndexError as e:
407db96d56Sopenharmony_ci                exc1 = e
417db96d56Sopenharmony_ci                raise
427db96d56Sopenharmony_ci        except IndexError as exc2:
437db96d56Sopenharmony_ci            self.assertIs(exc1, exc2)
447db96d56Sopenharmony_ci        else:
457db96d56Sopenharmony_ci            self.fail("No exception raised")
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci    def test_except_reraise(self):
487db96d56Sopenharmony_ci        def reraise():
497db96d56Sopenharmony_ci            try:
507db96d56Sopenharmony_ci                raise TypeError("foo")
517db96d56Sopenharmony_ci            except:
527db96d56Sopenharmony_ci                try:
537db96d56Sopenharmony_ci                    raise KeyError("caught")
547db96d56Sopenharmony_ci                except KeyError:
557db96d56Sopenharmony_ci                    pass
567db96d56Sopenharmony_ci                raise
577db96d56Sopenharmony_ci        self.assertRaises(TypeError, reraise)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci    def test_finally_reraise(self):
607db96d56Sopenharmony_ci        def reraise():
617db96d56Sopenharmony_ci            try:
627db96d56Sopenharmony_ci                raise TypeError("foo")
637db96d56Sopenharmony_ci            except:
647db96d56Sopenharmony_ci                try:
657db96d56Sopenharmony_ci                    raise KeyError("caught")
667db96d56Sopenharmony_ci                finally:
677db96d56Sopenharmony_ci                    raise
687db96d56Sopenharmony_ci        self.assertRaises(KeyError, reraise)
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci    def test_nested_reraise(self):
717db96d56Sopenharmony_ci        def nested_reraise():
727db96d56Sopenharmony_ci            raise
737db96d56Sopenharmony_ci        def reraise():
747db96d56Sopenharmony_ci            try:
757db96d56Sopenharmony_ci                raise TypeError("foo")
767db96d56Sopenharmony_ci            except:
777db96d56Sopenharmony_ci                nested_reraise()
787db96d56Sopenharmony_ci        self.assertRaises(TypeError, reraise)
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci    def test_raise_from_None(self):
817db96d56Sopenharmony_ci        try:
827db96d56Sopenharmony_ci            try:
837db96d56Sopenharmony_ci                raise TypeError("foo")
847db96d56Sopenharmony_ci            except:
857db96d56Sopenharmony_ci                raise ValueError() from None
867db96d56Sopenharmony_ci        except ValueError as e:
877db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, TypeError)
887db96d56Sopenharmony_ci            self.assertIsNone(e.__cause__)
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    def test_with_reraise1(self):
917db96d56Sopenharmony_ci        def reraise():
927db96d56Sopenharmony_ci            try:
937db96d56Sopenharmony_ci                raise TypeError("foo")
947db96d56Sopenharmony_ci            except:
957db96d56Sopenharmony_ci                with Context():
967db96d56Sopenharmony_ci                    pass
977db96d56Sopenharmony_ci                raise
987db96d56Sopenharmony_ci        self.assertRaises(TypeError, reraise)
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    def test_with_reraise2(self):
1017db96d56Sopenharmony_ci        def reraise():
1027db96d56Sopenharmony_ci            try:
1037db96d56Sopenharmony_ci                raise TypeError("foo")
1047db96d56Sopenharmony_ci            except:
1057db96d56Sopenharmony_ci                with Context():
1067db96d56Sopenharmony_ci                    raise KeyError("caught")
1077db96d56Sopenharmony_ci                raise
1087db96d56Sopenharmony_ci        self.assertRaises(TypeError, reraise)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci    def test_yield_reraise(self):
1117db96d56Sopenharmony_ci        def reraise():
1127db96d56Sopenharmony_ci            try:
1137db96d56Sopenharmony_ci                raise TypeError("foo")
1147db96d56Sopenharmony_ci            except:
1157db96d56Sopenharmony_ci                yield 1
1167db96d56Sopenharmony_ci                raise
1177db96d56Sopenharmony_ci        g = reraise()
1187db96d56Sopenharmony_ci        next(g)
1197db96d56Sopenharmony_ci        self.assertRaises(TypeError, lambda: next(g))
1207db96d56Sopenharmony_ci        self.assertRaises(StopIteration, lambda: next(g))
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    def test_erroneous_exception(self):
1237db96d56Sopenharmony_ci        class MyException(Exception):
1247db96d56Sopenharmony_ci            def __init__(self):
1257db96d56Sopenharmony_ci                raise RuntimeError()
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci        try:
1287db96d56Sopenharmony_ci            raise MyException
1297db96d56Sopenharmony_ci        except RuntimeError:
1307db96d56Sopenharmony_ci            pass
1317db96d56Sopenharmony_ci        else:
1327db96d56Sopenharmony_ci            self.fail("No exception raised")
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci    def test_new_returns_invalid_instance(self):
1357db96d56Sopenharmony_ci        # See issue #11627.
1367db96d56Sopenharmony_ci        class MyException(Exception):
1377db96d56Sopenharmony_ci            def __new__(cls, *args):
1387db96d56Sopenharmony_ci                return object()
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1417db96d56Sopenharmony_ci            raise MyException
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci    def test_assert_with_tuple_arg(self):
1447db96d56Sopenharmony_ci        try:
1457db96d56Sopenharmony_ci            assert False, (3,)
1467db96d56Sopenharmony_ci        except AssertionError as e:
1477db96d56Sopenharmony_ci            self.assertEqual(str(e), "(3,)")
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ciclass TestCause(unittest.TestCase):
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci    def testCauseSyntax(self):
1547db96d56Sopenharmony_ci        try:
1557db96d56Sopenharmony_ci            try:
1567db96d56Sopenharmony_ci                try:
1577db96d56Sopenharmony_ci                    raise TypeError
1587db96d56Sopenharmony_ci                except Exception:
1597db96d56Sopenharmony_ci                    raise ValueError from None
1607db96d56Sopenharmony_ci            except ValueError as exc:
1617db96d56Sopenharmony_ci                self.assertIsNone(exc.__cause__)
1627db96d56Sopenharmony_ci                self.assertTrue(exc.__suppress_context__)
1637db96d56Sopenharmony_ci                exc.__suppress_context__ = False
1647db96d56Sopenharmony_ci                raise exc
1657db96d56Sopenharmony_ci        except ValueError as exc:
1667db96d56Sopenharmony_ci            e = exc
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci        self.assertIsNone(e.__cause__)
1697db96d56Sopenharmony_ci        self.assertFalse(e.__suppress_context__)
1707db96d56Sopenharmony_ci        self.assertIsInstance(e.__context__, TypeError)
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci    def test_invalid_cause(self):
1737db96d56Sopenharmony_ci        try:
1747db96d56Sopenharmony_ci            raise IndexError from 5
1757db96d56Sopenharmony_ci        except TypeError as e:
1767db96d56Sopenharmony_ci            self.assertIn("exception cause", str(e))
1777db96d56Sopenharmony_ci        else:
1787db96d56Sopenharmony_ci            self.fail("No exception raised")
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    def test_class_cause(self):
1817db96d56Sopenharmony_ci        try:
1827db96d56Sopenharmony_ci            raise IndexError from KeyError
1837db96d56Sopenharmony_ci        except IndexError as e:
1847db96d56Sopenharmony_ci            self.assertIsInstance(e.__cause__, KeyError)
1857db96d56Sopenharmony_ci        else:
1867db96d56Sopenharmony_ci            self.fail("No exception raised")
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci    def test_instance_cause(self):
1897db96d56Sopenharmony_ci        cause = KeyError()
1907db96d56Sopenharmony_ci        try:
1917db96d56Sopenharmony_ci            raise IndexError from cause
1927db96d56Sopenharmony_ci        except IndexError as e:
1937db96d56Sopenharmony_ci            self.assertIs(e.__cause__, cause)
1947db96d56Sopenharmony_ci        else:
1957db96d56Sopenharmony_ci            self.fail("No exception raised")
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci    def test_erroneous_cause(self):
1987db96d56Sopenharmony_ci        class MyException(Exception):
1997db96d56Sopenharmony_ci            def __init__(self):
2007db96d56Sopenharmony_ci                raise RuntimeError()
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci        try:
2037db96d56Sopenharmony_ci            raise IndexError from MyException
2047db96d56Sopenharmony_ci        except RuntimeError:
2057db96d56Sopenharmony_ci            pass
2067db96d56Sopenharmony_ci        else:
2077db96d56Sopenharmony_ci            self.fail("No exception raised")
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ciclass TestTraceback(unittest.TestCase):
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    def test_sets_traceback(self):
2137db96d56Sopenharmony_ci        try:
2147db96d56Sopenharmony_ci            raise IndexError()
2157db96d56Sopenharmony_ci        except IndexError as e:
2167db96d56Sopenharmony_ci            self.assertIsInstance(e.__traceback__, types.TracebackType)
2177db96d56Sopenharmony_ci        else:
2187db96d56Sopenharmony_ci            self.fail("No exception raised")
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci    def test_accepts_traceback(self):
2217db96d56Sopenharmony_ci        tb = get_tb()
2227db96d56Sopenharmony_ci        try:
2237db96d56Sopenharmony_ci            raise IndexError().with_traceback(tb)
2247db96d56Sopenharmony_ci        except IndexError as e:
2257db96d56Sopenharmony_ci            self.assertNotEqual(e.__traceback__, tb)
2267db96d56Sopenharmony_ci            self.assertEqual(e.__traceback__.tb_next, tb)
2277db96d56Sopenharmony_ci        else:
2287db96d56Sopenharmony_ci            self.fail("No exception raised")
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ciclass TestTracebackType(unittest.TestCase):
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci    def raiser(self):
2347db96d56Sopenharmony_ci        raise ValueError
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci    def test_attrs(self):
2377db96d56Sopenharmony_ci        try:
2387db96d56Sopenharmony_ci            self.raiser()
2397db96d56Sopenharmony_ci        except Exception as exc:
2407db96d56Sopenharmony_ci            tb = exc.__traceback__
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci        self.assertIsInstance(tb.tb_next, types.TracebackType)
2437db96d56Sopenharmony_ci        self.assertIs(tb.tb_frame, sys._getframe())
2447db96d56Sopenharmony_ci        self.assertIsInstance(tb.tb_lasti, int)
2457db96d56Sopenharmony_ci        self.assertIsInstance(tb.tb_lineno, int)
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci        self.assertIs(tb.tb_next.tb_next, None)
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci        # Invalid assignments
2507db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2517db96d56Sopenharmony_ci            del tb.tb_next
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2547db96d56Sopenharmony_ci            tb.tb_next = "asdf"
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci        # Loops
2577db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
2587db96d56Sopenharmony_ci            tb.tb_next = tb
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
2617db96d56Sopenharmony_ci            tb.tb_next.tb_next = tb
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci        # Valid assignments
2647db96d56Sopenharmony_ci        tb.tb_next = None
2657db96d56Sopenharmony_ci        self.assertIs(tb.tb_next, None)
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci        new_tb = get_tb()
2687db96d56Sopenharmony_ci        tb.tb_next = new_tb
2697db96d56Sopenharmony_ci        self.assertIs(tb.tb_next, new_tb)
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    def test_constructor(self):
2727db96d56Sopenharmony_ci        other_tb = get_tb()
2737db96d56Sopenharmony_ci        frame = sys._getframe()
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci        tb = types.TracebackType(other_tb, frame, 1, 2)
2767db96d56Sopenharmony_ci        self.assertEqual(tb.tb_next, other_tb)
2777db96d56Sopenharmony_ci        self.assertEqual(tb.tb_frame, frame)
2787db96d56Sopenharmony_ci        self.assertEqual(tb.tb_lasti, 1)
2797db96d56Sopenharmony_ci        self.assertEqual(tb.tb_lineno, 2)
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci        tb = types.TracebackType(None, frame, 1, 2)
2827db96d56Sopenharmony_ci        self.assertEqual(tb.tb_next, None)
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2857db96d56Sopenharmony_ci            types.TracebackType("no", frame, 1, 2)
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2887db96d56Sopenharmony_ci            types.TracebackType(other_tb, "no", 1, 2)
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2917db96d56Sopenharmony_ci            types.TracebackType(other_tb, frame, "no", 2)
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2947db96d56Sopenharmony_ci            types.TracebackType(other_tb, frame, 1, "nuh-uh")
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ciclass TestContext(unittest.TestCase):
2987db96d56Sopenharmony_ci    def test_instance_context_instance_raise(self):
2997db96d56Sopenharmony_ci        context = IndexError()
3007db96d56Sopenharmony_ci        try:
3017db96d56Sopenharmony_ci            try:
3027db96d56Sopenharmony_ci                raise context
3037db96d56Sopenharmony_ci            except:
3047db96d56Sopenharmony_ci                raise OSError()
3057db96d56Sopenharmony_ci        except OSError as e:
3067db96d56Sopenharmony_ci            self.assertIs(e.__context__, context)
3077db96d56Sopenharmony_ci        else:
3087db96d56Sopenharmony_ci            self.fail("No exception raised")
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci    def test_class_context_instance_raise(self):
3117db96d56Sopenharmony_ci        context = IndexError
3127db96d56Sopenharmony_ci        try:
3137db96d56Sopenharmony_ci            try:
3147db96d56Sopenharmony_ci                raise context
3157db96d56Sopenharmony_ci            except:
3167db96d56Sopenharmony_ci                raise OSError()
3177db96d56Sopenharmony_ci        except OSError as e:
3187db96d56Sopenharmony_ci            self.assertIsNot(e.__context__, context)
3197db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, context)
3207db96d56Sopenharmony_ci        else:
3217db96d56Sopenharmony_ci            self.fail("No exception raised")
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci    def test_class_context_class_raise(self):
3247db96d56Sopenharmony_ci        context = IndexError
3257db96d56Sopenharmony_ci        try:
3267db96d56Sopenharmony_ci            try:
3277db96d56Sopenharmony_ci                raise context
3287db96d56Sopenharmony_ci            except:
3297db96d56Sopenharmony_ci                raise OSError
3307db96d56Sopenharmony_ci        except OSError as e:
3317db96d56Sopenharmony_ci            self.assertIsNot(e.__context__, context)
3327db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, context)
3337db96d56Sopenharmony_ci        else:
3347db96d56Sopenharmony_ci            self.fail("No exception raised")
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci    def test_c_exception_context(self):
3377db96d56Sopenharmony_ci        try:
3387db96d56Sopenharmony_ci            try:
3397db96d56Sopenharmony_ci                1/0
3407db96d56Sopenharmony_ci            except:
3417db96d56Sopenharmony_ci                raise OSError
3427db96d56Sopenharmony_ci        except OSError as e:
3437db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, ZeroDivisionError)
3447db96d56Sopenharmony_ci        else:
3457db96d56Sopenharmony_ci            self.fail("No exception raised")
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci    def test_c_exception_raise(self):
3487db96d56Sopenharmony_ci        try:
3497db96d56Sopenharmony_ci            try:
3507db96d56Sopenharmony_ci                1/0
3517db96d56Sopenharmony_ci            except:
3527db96d56Sopenharmony_ci                xyzzy
3537db96d56Sopenharmony_ci        except NameError as e:
3547db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, ZeroDivisionError)
3557db96d56Sopenharmony_ci        else:
3567db96d56Sopenharmony_ci            self.fail("No exception raised")
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ci    def test_noraise_finally(self):
3597db96d56Sopenharmony_ci        try:
3607db96d56Sopenharmony_ci            try:
3617db96d56Sopenharmony_ci                pass
3627db96d56Sopenharmony_ci            finally:
3637db96d56Sopenharmony_ci                raise OSError
3647db96d56Sopenharmony_ci        except OSError as e:
3657db96d56Sopenharmony_ci            self.assertIsNone(e.__context__)
3667db96d56Sopenharmony_ci        else:
3677db96d56Sopenharmony_ci            self.fail("No exception raised")
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci    def test_raise_finally(self):
3707db96d56Sopenharmony_ci        try:
3717db96d56Sopenharmony_ci            try:
3727db96d56Sopenharmony_ci                1/0
3737db96d56Sopenharmony_ci            finally:
3747db96d56Sopenharmony_ci                raise OSError
3757db96d56Sopenharmony_ci        except OSError as e:
3767db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, ZeroDivisionError)
3777db96d56Sopenharmony_ci        else:
3787db96d56Sopenharmony_ci            self.fail("No exception raised")
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci    def test_context_manager(self):
3817db96d56Sopenharmony_ci        class ContextManager:
3827db96d56Sopenharmony_ci            def __enter__(self):
3837db96d56Sopenharmony_ci                pass
3847db96d56Sopenharmony_ci            def __exit__(self, t, v, tb):
3857db96d56Sopenharmony_ci                xyzzy
3867db96d56Sopenharmony_ci        try:
3877db96d56Sopenharmony_ci            with ContextManager():
3887db96d56Sopenharmony_ci                1/0
3897db96d56Sopenharmony_ci        except NameError as e:
3907db96d56Sopenharmony_ci            self.assertIsInstance(e.__context__, ZeroDivisionError)
3917db96d56Sopenharmony_ci        else:
3927db96d56Sopenharmony_ci            self.fail("No exception raised")
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci    def test_cycle_broken(self):
3957db96d56Sopenharmony_ci        # Self-cycles (when re-raising a caught exception) are broken
3967db96d56Sopenharmony_ci        try:
3977db96d56Sopenharmony_ci            try:
3987db96d56Sopenharmony_ci                1/0
3997db96d56Sopenharmony_ci            except ZeroDivisionError as e:
4007db96d56Sopenharmony_ci                raise e
4017db96d56Sopenharmony_ci        except ZeroDivisionError as e:
4027db96d56Sopenharmony_ci            self.assertIsNone(e.__context__)
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    def test_reraise_cycle_broken(self):
4057db96d56Sopenharmony_ci        # Non-trivial context cycles (through re-raising a previous exception)
4067db96d56Sopenharmony_ci        # are broken too.
4077db96d56Sopenharmony_ci        try:
4087db96d56Sopenharmony_ci            try:
4097db96d56Sopenharmony_ci                xyzzy
4107db96d56Sopenharmony_ci            except NameError as a:
4117db96d56Sopenharmony_ci                try:
4127db96d56Sopenharmony_ci                    1/0
4137db96d56Sopenharmony_ci                except ZeroDivisionError:
4147db96d56Sopenharmony_ci                    raise a
4157db96d56Sopenharmony_ci        except NameError as e:
4167db96d56Sopenharmony_ci            self.assertIsNone(e.__context__.__context__)
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci    def test_not_last(self):
4197db96d56Sopenharmony_ci        # Context is not necessarily the last exception
4207db96d56Sopenharmony_ci        context = Exception("context")
4217db96d56Sopenharmony_ci        try:
4227db96d56Sopenharmony_ci            raise context
4237db96d56Sopenharmony_ci        except Exception:
4247db96d56Sopenharmony_ci            try:
4257db96d56Sopenharmony_ci                raise Exception("caught")
4267db96d56Sopenharmony_ci            except Exception:
4277db96d56Sopenharmony_ci                pass
4287db96d56Sopenharmony_ci            try:
4297db96d56Sopenharmony_ci                raise Exception("new")
4307db96d56Sopenharmony_ci            except Exception as exc:
4317db96d56Sopenharmony_ci                raised = exc
4327db96d56Sopenharmony_ci        self.assertIs(raised.__context__, context)
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci    def test_3118(self):
4357db96d56Sopenharmony_ci        # deleting the generator caused the __context__ to be cleared
4367db96d56Sopenharmony_ci        def gen():
4377db96d56Sopenharmony_ci            try:
4387db96d56Sopenharmony_ci                yield 1
4397db96d56Sopenharmony_ci            finally:
4407db96d56Sopenharmony_ci                pass
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci        def f():
4437db96d56Sopenharmony_ci            g = gen()
4447db96d56Sopenharmony_ci            next(g)
4457db96d56Sopenharmony_ci            try:
4467db96d56Sopenharmony_ci                try:
4477db96d56Sopenharmony_ci                    raise ValueError
4487db96d56Sopenharmony_ci                except:
4497db96d56Sopenharmony_ci                    del g
4507db96d56Sopenharmony_ci                    raise KeyError
4517db96d56Sopenharmony_ci            except Exception as e:
4527db96d56Sopenharmony_ci                self.assertIsInstance(e.__context__, ValueError)
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci        f()
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci    def test_3611(self):
4577db96d56Sopenharmony_ci        import gc
4587db96d56Sopenharmony_ci        # A re-raised exception in a __del__ caused the __context__
4597db96d56Sopenharmony_ci        # to be cleared
4607db96d56Sopenharmony_ci        class C:
4617db96d56Sopenharmony_ci            def __del__(self):
4627db96d56Sopenharmony_ci                try:
4637db96d56Sopenharmony_ci                    1/0
4647db96d56Sopenharmony_ci                except:
4657db96d56Sopenharmony_ci                    raise
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci        def f():
4687db96d56Sopenharmony_ci            x = C()
4697db96d56Sopenharmony_ci            try:
4707db96d56Sopenharmony_ci                try:
4717db96d56Sopenharmony_ci                    f.x
4727db96d56Sopenharmony_ci                except AttributeError:
4737db96d56Sopenharmony_ci                    # make x.__del__ trigger
4747db96d56Sopenharmony_ci                    del x
4757db96d56Sopenharmony_ci                    gc.collect()  # For PyPy or other GCs.
4767db96d56Sopenharmony_ci                    raise TypeError
4777db96d56Sopenharmony_ci            except Exception as e:
4787db96d56Sopenharmony_ci                self.assertNotEqual(e.__context__, None)
4797db96d56Sopenharmony_ci                self.assertIsInstance(e.__context__, AttributeError)
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci        with support.catch_unraisable_exception() as cm:
4827db96d56Sopenharmony_ci            f()
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci            self.assertEqual(ZeroDivisionError, cm.unraisable.exc_type)
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ciclass TestRemovedFunctionality(unittest.TestCase):
4887db96d56Sopenharmony_ci    def test_tuples(self):
4897db96d56Sopenharmony_ci        try:
4907db96d56Sopenharmony_ci            raise (IndexError, KeyError) # This should be a tuple!
4917db96d56Sopenharmony_ci        except TypeError:
4927db96d56Sopenharmony_ci            pass
4937db96d56Sopenharmony_ci        else:
4947db96d56Sopenharmony_ci            self.fail("No exception raised")
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci    def test_strings(self):
4977db96d56Sopenharmony_ci        try:
4987db96d56Sopenharmony_ci            raise "foo"
4997db96d56Sopenharmony_ci        except TypeError:
5007db96d56Sopenharmony_ci            pass
5017db96d56Sopenharmony_ci        else:
5027db96d56Sopenharmony_ci            self.fail("No exception raised")
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ciif __name__ == "__main__":
5067db96d56Sopenharmony_ci    unittest.main()
507