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