17db96d56Sopenharmony_ci# Python test set -- part 5, built-in exceptions 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport copy 47db96d56Sopenharmony_ciimport gc 57db96d56Sopenharmony_ciimport os 67db96d56Sopenharmony_ciimport sys 77db96d56Sopenharmony_ciimport unittest 87db96d56Sopenharmony_ciimport pickle 97db96d56Sopenharmony_ciimport weakref 107db96d56Sopenharmony_ciimport errno 117db96d56Sopenharmony_cifrom textwrap import dedent 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_cifrom test.support import (captured_stderr, check_impl_detail, 147db96d56Sopenharmony_ci cpython_only, gc_collect, 157db96d56Sopenharmony_ci no_tracing, script_helper, 167db96d56Sopenharmony_ci SuppressCrashReport) 177db96d56Sopenharmony_cifrom test.support.import_helper import import_module 187db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink 197db96d56Sopenharmony_cifrom test.support.warnings_helper import check_warnings 207db96d56Sopenharmony_cifrom test import support 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ciclass NaiveException(Exception): 247db96d56Sopenharmony_ci def __init__(self, x): 257db96d56Sopenharmony_ci self.x = x 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciclass SlottedNaiveException(Exception): 287db96d56Sopenharmony_ci __slots__ = ('x',) 297db96d56Sopenharmony_ci def __init__(self, x): 307db96d56Sopenharmony_ci self.x = x 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ciclass BrokenStrException(Exception): 337db96d56Sopenharmony_ci def __str__(self): 347db96d56Sopenharmony_ci raise Exception("str() is broken") 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci# XXX This is not really enough, each *operation* should be tested! 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ciclass ExceptionTests(unittest.TestCase): 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci def raise_catch(self, exc, excname): 417db96d56Sopenharmony_ci with self.subTest(exc=exc, excname=excname): 427db96d56Sopenharmony_ci try: 437db96d56Sopenharmony_ci raise exc("spam") 447db96d56Sopenharmony_ci except exc as err: 457db96d56Sopenharmony_ci buf1 = str(err) 467db96d56Sopenharmony_ci try: 477db96d56Sopenharmony_ci raise exc("spam") 487db96d56Sopenharmony_ci except exc as err: 497db96d56Sopenharmony_ci buf2 = str(err) 507db96d56Sopenharmony_ci self.assertEqual(buf1, buf2) 517db96d56Sopenharmony_ci self.assertEqual(exc.__name__, excname) 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci def testRaising(self): 547db96d56Sopenharmony_ci self.raise_catch(AttributeError, "AttributeError") 557db96d56Sopenharmony_ci self.assertRaises(AttributeError, getattr, sys, "undefined_attribute") 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci self.raise_catch(EOFError, "EOFError") 587db96d56Sopenharmony_ci fp = open(TESTFN, 'w', encoding="utf-8") 597db96d56Sopenharmony_ci fp.close() 607db96d56Sopenharmony_ci fp = open(TESTFN, 'r', encoding="utf-8") 617db96d56Sopenharmony_ci savestdin = sys.stdin 627db96d56Sopenharmony_ci try: 637db96d56Sopenharmony_ci try: 647db96d56Sopenharmony_ci import marshal 657db96d56Sopenharmony_ci marshal.loads(b'') 667db96d56Sopenharmony_ci except EOFError: 677db96d56Sopenharmony_ci pass 687db96d56Sopenharmony_ci finally: 697db96d56Sopenharmony_ci sys.stdin = savestdin 707db96d56Sopenharmony_ci fp.close() 717db96d56Sopenharmony_ci unlink(TESTFN) 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci self.raise_catch(OSError, "OSError") 747db96d56Sopenharmony_ci self.assertRaises(OSError, open, 'this file does not exist', 'r') 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci self.raise_catch(ImportError, "ImportError") 777db96d56Sopenharmony_ci self.assertRaises(ImportError, __import__, "undefined_module") 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci self.raise_catch(IndexError, "IndexError") 807db96d56Sopenharmony_ci x = [] 817db96d56Sopenharmony_ci self.assertRaises(IndexError, x.__getitem__, 10) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci self.raise_catch(KeyError, "KeyError") 847db96d56Sopenharmony_ci x = {} 857db96d56Sopenharmony_ci self.assertRaises(KeyError, x.__getitem__, 'key') 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci self.raise_catch(KeyboardInterrupt, "KeyboardInterrupt") 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci self.raise_catch(MemoryError, "MemoryError") 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci self.raise_catch(NameError, "NameError") 927db96d56Sopenharmony_ci try: x = undefined_variable 937db96d56Sopenharmony_ci except NameError: pass 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci self.raise_catch(OverflowError, "OverflowError") 967db96d56Sopenharmony_ci x = 1 977db96d56Sopenharmony_ci for dummy in range(128): 987db96d56Sopenharmony_ci x += x # this simply shouldn't blow up 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci self.raise_catch(RuntimeError, "RuntimeError") 1017db96d56Sopenharmony_ci self.raise_catch(RecursionError, "RecursionError") 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci self.raise_catch(SyntaxError, "SyntaxError") 1047db96d56Sopenharmony_ci try: exec('/\n') 1057db96d56Sopenharmony_ci except SyntaxError: pass 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci self.raise_catch(IndentationError, "IndentationError") 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci self.raise_catch(TabError, "TabError") 1107db96d56Sopenharmony_ci try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", 1117db96d56Sopenharmony_ci '<string>', 'exec') 1127db96d56Sopenharmony_ci except TabError: pass 1137db96d56Sopenharmony_ci else: self.fail("TabError not raised") 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci self.raise_catch(SystemError, "SystemError") 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci self.raise_catch(SystemExit, "SystemExit") 1187db96d56Sopenharmony_ci self.assertRaises(SystemExit, sys.exit, 0) 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci self.raise_catch(TypeError, "TypeError") 1217db96d56Sopenharmony_ci try: [] + () 1227db96d56Sopenharmony_ci except TypeError: pass 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci self.raise_catch(ValueError, "ValueError") 1257db96d56Sopenharmony_ci self.assertRaises(ValueError, chr, 17<<16) 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci self.raise_catch(ZeroDivisionError, "ZeroDivisionError") 1287db96d56Sopenharmony_ci try: x = 1/0 1297db96d56Sopenharmony_ci except ZeroDivisionError: pass 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci self.raise_catch(Exception, "Exception") 1327db96d56Sopenharmony_ci try: x = 1/0 1337db96d56Sopenharmony_ci except Exception as e: pass 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci self.raise_catch(StopAsyncIteration, "StopAsyncIteration") 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ci def testSyntaxErrorMessage(self): 1387db96d56Sopenharmony_ci # make sure the right exception message is raised for each of 1397db96d56Sopenharmony_ci # these code fragments 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci def ckmsg(src, msg): 1427db96d56Sopenharmony_ci with self.subTest(src=src, msg=msg): 1437db96d56Sopenharmony_ci try: 1447db96d56Sopenharmony_ci compile(src, '<fragment>', 'exec') 1457db96d56Sopenharmony_ci except SyntaxError as e: 1467db96d56Sopenharmony_ci if e.msg != msg: 1477db96d56Sopenharmony_ci self.fail("expected %s, got %s" % (msg, e.msg)) 1487db96d56Sopenharmony_ci else: 1497db96d56Sopenharmony_ci self.fail("failed to get expected SyntaxError") 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci s = '''if 1: 1527db96d56Sopenharmony_ci try: 1537db96d56Sopenharmony_ci continue 1547db96d56Sopenharmony_ci except: 1557db96d56Sopenharmony_ci pass''' 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci ckmsg(s, "'continue' not properly in loop") 1587db96d56Sopenharmony_ci ckmsg("continue\n", "'continue' not properly in loop") 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci def testSyntaxErrorMissingParens(self): 1617db96d56Sopenharmony_ci def ckmsg(src, msg, exception=SyntaxError): 1627db96d56Sopenharmony_ci try: 1637db96d56Sopenharmony_ci compile(src, '<fragment>', 'exec') 1647db96d56Sopenharmony_ci except exception as e: 1657db96d56Sopenharmony_ci if e.msg != msg: 1667db96d56Sopenharmony_ci self.fail("expected %s, got %s" % (msg, e.msg)) 1677db96d56Sopenharmony_ci else: 1687db96d56Sopenharmony_ci self.fail("failed to get expected SyntaxError") 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci s = '''print "old style"''' 1717db96d56Sopenharmony_ci ckmsg(s, "Missing parentheses in call to 'print'. Did you mean print(...)?") 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci s = '''print "old style",''' 1747db96d56Sopenharmony_ci ckmsg(s, "Missing parentheses in call to 'print'. Did you mean print(...)?") 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci s = 'print f(a+b,c)' 1777db96d56Sopenharmony_ci ckmsg(s, "Missing parentheses in call to 'print'. Did you mean print(...)?") 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci s = '''exec "old style"''' 1807db96d56Sopenharmony_ci ckmsg(s, "Missing parentheses in call to 'exec'. Did you mean exec(...)?") 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci s = 'exec f(a+b,c)' 1837db96d56Sopenharmony_ci ckmsg(s, "Missing parentheses in call to 'exec'. Did you mean exec(...)?") 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci # Check that we don't incorrectly identify '(...)' as an expression to the right 1867db96d56Sopenharmony_ci # of 'print' 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci s = 'print (a+b,c) $ 42' 1897db96d56Sopenharmony_ci ckmsg(s, "invalid syntax") 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci s = 'exec (a+b,c) $ 42' 1927db96d56Sopenharmony_ci ckmsg(s, "invalid syntax") 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci # should not apply to subclasses, see issue #31161 1957db96d56Sopenharmony_ci s = '''if True:\nprint "No indent"''' 1967db96d56Sopenharmony_ci ckmsg(s, "expected an indented block after 'if' statement on line 1", IndentationError) 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci s = '''if True:\n print()\n\texec "mixed tabs and spaces"''' 1997db96d56Sopenharmony_ci ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError) 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci def check(self, src, lineno, offset, end_lineno=None, end_offset=None, encoding='utf-8'): 2027db96d56Sopenharmony_ci with self.subTest(source=src, lineno=lineno, offset=offset): 2037db96d56Sopenharmony_ci with self.assertRaises(SyntaxError) as cm: 2047db96d56Sopenharmony_ci compile(src, '<fragment>', 'exec') 2057db96d56Sopenharmony_ci self.assertEqual(cm.exception.lineno, lineno) 2067db96d56Sopenharmony_ci self.assertEqual(cm.exception.offset, offset) 2077db96d56Sopenharmony_ci if end_lineno is not None: 2087db96d56Sopenharmony_ci self.assertEqual(cm.exception.end_lineno, end_lineno) 2097db96d56Sopenharmony_ci if end_offset is not None: 2107db96d56Sopenharmony_ci self.assertEqual(cm.exception.end_offset, end_offset) 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci if cm.exception.text is not None: 2137db96d56Sopenharmony_ci if not isinstance(src, str): 2147db96d56Sopenharmony_ci src = src.decode(encoding, 'replace') 2157db96d56Sopenharmony_ci line = src.split('\n')[lineno-1] 2167db96d56Sopenharmony_ci self.assertIn(line, cm.exception.text) 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci def test_error_offset_continuation_characters(self): 2197db96d56Sopenharmony_ci check = self.check 2207db96d56Sopenharmony_ci check('"\\\n"(1 for c in I,\\\n\\', 2, 2) 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci def testSyntaxErrorOffset(self): 2237db96d56Sopenharmony_ci check = self.check 2247db96d56Sopenharmony_ci check('def fact(x):\n\treturn x!\n', 2, 10) 2257db96d56Sopenharmony_ci check('1 +\n', 1, 4) 2267db96d56Sopenharmony_ci check('def spam():\n print(1)\n print(2)', 3, 10) 2277db96d56Sopenharmony_ci check('Python = "Python" +', 1, 20) 2287db96d56Sopenharmony_ci check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20) 2297db96d56Sopenharmony_ci check(b'# -*- coding: cp1251 -*-\nPython = "\xcf\xb3\xf2\xee\xed" +', 2307db96d56Sopenharmony_ci 2, 19, encoding='cp1251') 2317db96d56Sopenharmony_ci check(b'Python = "\xcf\xb3\xf2\xee\xed" +', 1, 18) 2327db96d56Sopenharmony_ci check('x = "a', 1, 5) 2337db96d56Sopenharmony_ci check('lambda x: x = 2', 1, 1) 2347db96d56Sopenharmony_ci check('f{a + b + c}', 1, 2) 2357db96d56Sopenharmony_ci check('[file for str(file) in []\n]', 1, 11) 2367db96d56Sopenharmony_ci check('a = « hello » « world »', 1, 5) 2377db96d56Sopenharmony_ci check('[\nfile\nfor str(file)\nin\n[]\n]', 3, 5) 2387db96d56Sopenharmony_ci check('[file for\n str(file) in []]', 2, 2) 2397db96d56Sopenharmony_ci check("ages = {'Alice'=22, 'Bob'=23}", 1, 9) 2407db96d56Sopenharmony_ci check('match ...:\n case {**rest, "key": value}:\n ...', 2, 19) 2417db96d56Sopenharmony_ci check("[a b c d e f]", 1, 2) 2427db96d56Sopenharmony_ci check("for x yfff:", 1, 7) 2437db96d56Sopenharmony_ci check("f(a for a in b, c)", 1, 3, 1, 15) 2447db96d56Sopenharmony_ci check("f(a for a in b if a, c)", 1, 3, 1, 20) 2457db96d56Sopenharmony_ci check("f(a, b for b in c)", 1, 6, 1, 18) 2467db96d56Sopenharmony_ci check("f(a, b for b in c, d)", 1, 6, 1, 18) 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci # Errors thrown by compile.c 2497db96d56Sopenharmony_ci check('class foo:return 1', 1, 11) 2507db96d56Sopenharmony_ci check('def f():\n continue', 2, 3) 2517db96d56Sopenharmony_ci check('def f():\n break', 2, 3) 2527db96d56Sopenharmony_ci check('try:\n pass\nexcept:\n pass\nexcept ValueError:\n pass', 3, 1) 2537db96d56Sopenharmony_ci check('try:\n pass\nexcept*:\n pass', 3, 8) 2547db96d56Sopenharmony_ci check('try:\n pass\nexcept*:\n pass\nexcept* ValueError:\n pass', 3, 8) 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci # Errors thrown by tokenizer.c 2577db96d56Sopenharmony_ci check('(0x+1)', 1, 3) 2587db96d56Sopenharmony_ci check('x = 0xI', 1, 6) 2597db96d56Sopenharmony_ci check('0010 + 2', 1, 1) 2607db96d56Sopenharmony_ci check('x = 32e-+4', 1, 8) 2617db96d56Sopenharmony_ci check('x = 0o9', 1, 7) 2627db96d56Sopenharmony_ci check('\u03b1 = 0xI', 1, 6) 2637db96d56Sopenharmony_ci check(b'\xce\xb1 = 0xI', 1, 6) 2647db96d56Sopenharmony_ci check(b'# -*- coding: iso8859-7 -*-\n\xe1 = 0xI', 2, 6, 2657db96d56Sopenharmony_ci encoding='iso8859-7') 2667db96d56Sopenharmony_ci check(b"""if 1: 2677db96d56Sopenharmony_ci def foo(): 2687db96d56Sopenharmony_ci ''' 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci def bar(): 2717db96d56Sopenharmony_ci pass 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci def baz(): 2747db96d56Sopenharmony_ci '''quux''' 2757db96d56Sopenharmony_ci """, 9, 24) 2767db96d56Sopenharmony_ci check("pass\npass\npass\n(1+)\npass\npass\npass", 4, 4) 2777db96d56Sopenharmony_ci check("(1+)", 1, 4) 2787db96d56Sopenharmony_ci check("[interesting\nfoo()\n", 1, 1) 2797db96d56Sopenharmony_ci check(b"\xef\xbb\xbf#coding: utf8\nprint('\xe6\x88\x91')\n", 0, -1) 2807db96d56Sopenharmony_ci check("""f''' 2817db96d56Sopenharmony_ci { 2827db96d56Sopenharmony_ci (123_a) 2837db96d56Sopenharmony_ci }'''""", 3, 17) 2847db96d56Sopenharmony_ci check("""f''' 2857db96d56Sopenharmony_ci { 2867db96d56Sopenharmony_ci f\"\"\" 2877db96d56Sopenharmony_ci { 2887db96d56Sopenharmony_ci (123_a) 2897db96d56Sopenharmony_ci } 2907db96d56Sopenharmony_ci \"\"\" 2917db96d56Sopenharmony_ci }'''""", 5, 17) 2927db96d56Sopenharmony_ci check('''f""" 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci { 2967db96d56Sopenharmony_ci 6 2977db96d56Sopenharmony_ci 0="""''', 5, 13) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci # Errors thrown by symtable.c 3007db96d56Sopenharmony_ci check('x = [(yield i) for i in range(3)]', 1, 7) 3017db96d56Sopenharmony_ci check('def f():\n from _ import *', 2, 17) 3027db96d56Sopenharmony_ci check('def f(x, x):\n pass', 1, 10) 3037db96d56Sopenharmony_ci check('{i for i in range(5) if (j := 0) for j in range(5)}', 1, 38) 3047db96d56Sopenharmony_ci check('def f(x):\n nonlocal x', 2, 3) 3057db96d56Sopenharmony_ci check('def f(x):\n x = 1\n global x', 3, 3) 3067db96d56Sopenharmony_ci check('nonlocal x', 1, 1) 3077db96d56Sopenharmony_ci check('def f():\n global x\n nonlocal x', 2, 3) 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci # Errors thrown by future.c 3107db96d56Sopenharmony_ci check('from __future__ import doesnt_exist', 1, 1) 3117db96d56Sopenharmony_ci check('from __future__ import braces', 1, 1) 3127db96d56Sopenharmony_ci check('x=1\nfrom __future__ import division', 2, 1) 3137db96d56Sopenharmony_ci check('foo(1=2)', 1, 5) 3147db96d56Sopenharmony_ci check('def f():\n x, y: int', 2, 3) 3157db96d56Sopenharmony_ci check('[*x for x in xs]', 1, 2) 3167db96d56Sopenharmony_ci check('foo(x for x in range(10), 100)', 1, 5) 3177db96d56Sopenharmony_ci check('for 1 in []: pass', 1, 5) 3187db96d56Sopenharmony_ci check('(yield i) = 2', 1, 2) 3197db96d56Sopenharmony_ci check('def f(*):\n pass', 1, 7) 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci @cpython_only 3227db96d56Sopenharmony_ci def testSettingException(self): 3237db96d56Sopenharmony_ci # test that setting an exception at the C level works even if the 3247db96d56Sopenharmony_ci # exception object can't be constructed. 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci class BadException(Exception): 3277db96d56Sopenharmony_ci def __init__(self_): 3287db96d56Sopenharmony_ci raise RuntimeError("can't instantiate BadException") 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci class InvalidException: 3317db96d56Sopenharmony_ci pass 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci def test_capi1(): 3347db96d56Sopenharmony_ci import _testcapi 3357db96d56Sopenharmony_ci try: 3367db96d56Sopenharmony_ci _testcapi.raise_exception(BadException, 1) 3377db96d56Sopenharmony_ci except TypeError as err: 3387db96d56Sopenharmony_ci exc, err, tb = sys.exc_info() 3397db96d56Sopenharmony_ci co = tb.tb_frame.f_code 3407db96d56Sopenharmony_ci self.assertEqual(co.co_name, "test_capi1") 3417db96d56Sopenharmony_ci self.assertTrue(co.co_filename.endswith('test_exceptions.py')) 3427db96d56Sopenharmony_ci else: 3437db96d56Sopenharmony_ci self.fail("Expected exception") 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci def test_capi2(): 3467db96d56Sopenharmony_ci import _testcapi 3477db96d56Sopenharmony_ci try: 3487db96d56Sopenharmony_ci _testcapi.raise_exception(BadException, 0) 3497db96d56Sopenharmony_ci except RuntimeError as err: 3507db96d56Sopenharmony_ci exc, err, tb = sys.exc_info() 3517db96d56Sopenharmony_ci co = tb.tb_frame.f_code 3527db96d56Sopenharmony_ci self.assertEqual(co.co_name, "__init__") 3537db96d56Sopenharmony_ci self.assertTrue(co.co_filename.endswith('test_exceptions.py')) 3547db96d56Sopenharmony_ci co2 = tb.tb_frame.f_back.f_code 3557db96d56Sopenharmony_ci self.assertEqual(co2.co_name, "test_capi2") 3567db96d56Sopenharmony_ci else: 3577db96d56Sopenharmony_ci self.fail("Expected exception") 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci def test_capi3(): 3607db96d56Sopenharmony_ci import _testcapi 3617db96d56Sopenharmony_ci self.assertRaises(SystemError, _testcapi.raise_exception, 3627db96d56Sopenharmony_ci InvalidException, 1) 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci if not sys.platform.startswith('java'): 3657db96d56Sopenharmony_ci test_capi1() 3667db96d56Sopenharmony_ci test_capi2() 3677db96d56Sopenharmony_ci test_capi3() 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci def test_WindowsError(self): 3707db96d56Sopenharmony_ci try: 3717db96d56Sopenharmony_ci WindowsError 3727db96d56Sopenharmony_ci except NameError: 3737db96d56Sopenharmony_ci pass 3747db96d56Sopenharmony_ci else: 3757db96d56Sopenharmony_ci self.assertIs(WindowsError, OSError) 3767db96d56Sopenharmony_ci self.assertEqual(str(OSError(1001)), "1001") 3777db96d56Sopenharmony_ci self.assertEqual(str(OSError(1001, "message")), 3787db96d56Sopenharmony_ci "[Errno 1001] message") 3797db96d56Sopenharmony_ci # POSIX errno (9 aka EBADF) is untranslated 3807db96d56Sopenharmony_ci w = OSError(9, 'foo', 'bar') 3817db96d56Sopenharmony_ci self.assertEqual(w.errno, 9) 3827db96d56Sopenharmony_ci self.assertEqual(w.winerror, None) 3837db96d56Sopenharmony_ci self.assertEqual(str(w), "[Errno 9] foo: 'bar'") 3847db96d56Sopenharmony_ci # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2) 3857db96d56Sopenharmony_ci w = OSError(0, 'foo', 'bar', 3) 3867db96d56Sopenharmony_ci self.assertEqual(w.errno, 2) 3877db96d56Sopenharmony_ci self.assertEqual(w.winerror, 3) 3887db96d56Sopenharmony_ci self.assertEqual(w.strerror, 'foo') 3897db96d56Sopenharmony_ci self.assertEqual(w.filename, 'bar') 3907db96d56Sopenharmony_ci self.assertEqual(w.filename2, None) 3917db96d56Sopenharmony_ci self.assertEqual(str(w), "[WinError 3] foo: 'bar'") 3927db96d56Sopenharmony_ci # Unknown win error becomes EINVAL (22) 3937db96d56Sopenharmony_ci w = OSError(0, 'foo', None, 1001) 3947db96d56Sopenharmony_ci self.assertEqual(w.errno, 22) 3957db96d56Sopenharmony_ci self.assertEqual(w.winerror, 1001) 3967db96d56Sopenharmony_ci self.assertEqual(w.strerror, 'foo') 3977db96d56Sopenharmony_ci self.assertEqual(w.filename, None) 3987db96d56Sopenharmony_ci self.assertEqual(w.filename2, None) 3997db96d56Sopenharmony_ci self.assertEqual(str(w), "[WinError 1001] foo") 4007db96d56Sopenharmony_ci # Non-numeric "errno" 4017db96d56Sopenharmony_ci w = OSError('bar', 'foo') 4027db96d56Sopenharmony_ci self.assertEqual(w.errno, 'bar') 4037db96d56Sopenharmony_ci self.assertEqual(w.winerror, None) 4047db96d56Sopenharmony_ci self.assertEqual(w.strerror, 'foo') 4057db96d56Sopenharmony_ci self.assertEqual(w.filename, None) 4067db96d56Sopenharmony_ci self.assertEqual(w.filename2, None) 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci @unittest.skipUnless(sys.platform == 'win32', 4097db96d56Sopenharmony_ci 'test specific to Windows') 4107db96d56Sopenharmony_ci def test_windows_message(self): 4117db96d56Sopenharmony_ci """Should fill in unknown error code in Windows error message""" 4127db96d56Sopenharmony_ci ctypes = import_module('ctypes') 4137db96d56Sopenharmony_ci # this error code has no message, Python formats it as hexadecimal 4147db96d56Sopenharmony_ci code = 3765269347 4157db96d56Sopenharmony_ci with self.assertRaisesRegex(OSError, 'Windows Error 0x%x' % code): 4167db96d56Sopenharmony_ci ctypes.pythonapi.PyErr_SetFromWindowsErr(code) 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci def testAttributes(self): 4197db96d56Sopenharmony_ci # test that exception attributes are happy 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci exceptionList = [ 4227db96d56Sopenharmony_ci (BaseException, (), {'args' : ()}), 4237db96d56Sopenharmony_ci (BaseException, (1, ), {'args' : (1,)}), 4247db96d56Sopenharmony_ci (BaseException, ('foo',), 4257db96d56Sopenharmony_ci {'args' : ('foo',)}), 4267db96d56Sopenharmony_ci (BaseException, ('foo', 1), 4277db96d56Sopenharmony_ci {'args' : ('foo', 1)}), 4287db96d56Sopenharmony_ci (SystemExit, ('foo',), 4297db96d56Sopenharmony_ci {'args' : ('foo',), 'code' : 'foo'}), 4307db96d56Sopenharmony_ci (OSError, ('foo',), 4317db96d56Sopenharmony_ci {'args' : ('foo',), 'filename' : None, 'filename2' : None, 4327db96d56Sopenharmony_ci 'errno' : None, 'strerror' : None}), 4337db96d56Sopenharmony_ci (OSError, ('foo', 'bar'), 4347db96d56Sopenharmony_ci {'args' : ('foo', 'bar'), 4357db96d56Sopenharmony_ci 'filename' : None, 'filename2' : None, 4367db96d56Sopenharmony_ci 'errno' : 'foo', 'strerror' : 'bar'}), 4377db96d56Sopenharmony_ci (OSError, ('foo', 'bar', 'baz'), 4387db96d56Sopenharmony_ci {'args' : ('foo', 'bar'), 4397db96d56Sopenharmony_ci 'filename' : 'baz', 'filename2' : None, 4407db96d56Sopenharmony_ci 'errno' : 'foo', 'strerror' : 'bar'}), 4417db96d56Sopenharmony_ci (OSError, ('foo', 'bar', 'baz', None, 'quux'), 4427db96d56Sopenharmony_ci {'args' : ('foo', 'bar'), 'filename' : 'baz', 'filename2': 'quux'}), 4437db96d56Sopenharmony_ci (OSError, ('errnoStr', 'strErrorStr', 'filenameStr'), 4447db96d56Sopenharmony_ci {'args' : ('errnoStr', 'strErrorStr'), 4457db96d56Sopenharmony_ci 'strerror' : 'strErrorStr', 'errno' : 'errnoStr', 4467db96d56Sopenharmony_ci 'filename' : 'filenameStr'}), 4477db96d56Sopenharmony_ci (OSError, (1, 'strErrorStr', 'filenameStr'), 4487db96d56Sopenharmony_ci {'args' : (1, 'strErrorStr'), 'errno' : 1, 4497db96d56Sopenharmony_ci 'strerror' : 'strErrorStr', 4507db96d56Sopenharmony_ci 'filename' : 'filenameStr', 'filename2' : None}), 4517db96d56Sopenharmony_ci (SyntaxError, (), {'msg' : None, 'text' : None, 4527db96d56Sopenharmony_ci 'filename' : None, 'lineno' : None, 'offset' : None, 4537db96d56Sopenharmony_ci 'end_offset': None, 'print_file_and_line' : None}), 4547db96d56Sopenharmony_ci (SyntaxError, ('msgStr',), 4557db96d56Sopenharmony_ci {'args' : ('msgStr',), 'text' : None, 4567db96d56Sopenharmony_ci 'print_file_and_line' : None, 'msg' : 'msgStr', 4577db96d56Sopenharmony_ci 'filename' : None, 'lineno' : None, 'offset' : None, 4587db96d56Sopenharmony_ci 'end_offset': None}), 4597db96d56Sopenharmony_ci (SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr', 4607db96d56Sopenharmony_ci 'textStr', 'endLinenoStr', 'endOffsetStr')), 4617db96d56Sopenharmony_ci {'offset' : 'offsetStr', 'text' : 'textStr', 4627db96d56Sopenharmony_ci 'args' : ('msgStr', ('filenameStr', 'linenoStr', 4637db96d56Sopenharmony_ci 'offsetStr', 'textStr', 4647db96d56Sopenharmony_ci 'endLinenoStr', 'endOffsetStr')), 4657db96d56Sopenharmony_ci 'print_file_and_line' : None, 'msg' : 'msgStr', 4667db96d56Sopenharmony_ci 'filename' : 'filenameStr', 'lineno' : 'linenoStr', 4677db96d56Sopenharmony_ci 'end_lineno': 'endLinenoStr', 'end_offset': 'endOffsetStr'}), 4687db96d56Sopenharmony_ci (SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr', 4697db96d56Sopenharmony_ci 'textStr', 'endLinenoStr', 'endOffsetStr', 4707db96d56Sopenharmony_ci 'print_file_and_lineStr'), 4717db96d56Sopenharmony_ci {'text' : None, 4727db96d56Sopenharmony_ci 'args' : ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr', 4737db96d56Sopenharmony_ci 'textStr', 'endLinenoStr', 'endOffsetStr', 4747db96d56Sopenharmony_ci 'print_file_and_lineStr'), 4757db96d56Sopenharmony_ci 'print_file_and_line' : None, 'msg' : 'msgStr', 4767db96d56Sopenharmony_ci 'filename' : None, 'lineno' : None, 'offset' : None, 4777db96d56Sopenharmony_ci 'end_lineno': None, 'end_offset': None}), 4787db96d56Sopenharmony_ci (UnicodeError, (), {'args' : (),}), 4797db96d56Sopenharmony_ci (UnicodeEncodeError, ('ascii', 'a', 0, 1, 4807db96d56Sopenharmony_ci 'ordinal not in range'), 4817db96d56Sopenharmony_ci {'args' : ('ascii', 'a', 0, 1, 4827db96d56Sopenharmony_ci 'ordinal not in range'), 4837db96d56Sopenharmony_ci 'encoding' : 'ascii', 'object' : 'a', 4847db96d56Sopenharmony_ci 'start' : 0, 'reason' : 'ordinal not in range'}), 4857db96d56Sopenharmony_ci (UnicodeDecodeError, ('ascii', bytearray(b'\xff'), 0, 1, 4867db96d56Sopenharmony_ci 'ordinal not in range'), 4877db96d56Sopenharmony_ci {'args' : ('ascii', bytearray(b'\xff'), 0, 1, 4887db96d56Sopenharmony_ci 'ordinal not in range'), 4897db96d56Sopenharmony_ci 'encoding' : 'ascii', 'object' : b'\xff', 4907db96d56Sopenharmony_ci 'start' : 0, 'reason' : 'ordinal not in range'}), 4917db96d56Sopenharmony_ci (UnicodeDecodeError, ('ascii', b'\xff', 0, 1, 4927db96d56Sopenharmony_ci 'ordinal not in range'), 4937db96d56Sopenharmony_ci {'args' : ('ascii', b'\xff', 0, 1, 4947db96d56Sopenharmony_ci 'ordinal not in range'), 4957db96d56Sopenharmony_ci 'encoding' : 'ascii', 'object' : b'\xff', 4967db96d56Sopenharmony_ci 'start' : 0, 'reason' : 'ordinal not in range'}), 4977db96d56Sopenharmony_ci (UnicodeTranslateError, ("\u3042", 0, 1, "ouch"), 4987db96d56Sopenharmony_ci {'args' : ('\u3042', 0, 1, 'ouch'), 4997db96d56Sopenharmony_ci 'object' : '\u3042', 'reason' : 'ouch', 5007db96d56Sopenharmony_ci 'start' : 0, 'end' : 1}), 5017db96d56Sopenharmony_ci (NaiveException, ('foo',), 5027db96d56Sopenharmony_ci {'args': ('foo',), 'x': 'foo'}), 5037db96d56Sopenharmony_ci (SlottedNaiveException, ('foo',), 5047db96d56Sopenharmony_ci {'args': ('foo',), 'x': 'foo'}), 5057db96d56Sopenharmony_ci ] 5067db96d56Sopenharmony_ci try: 5077db96d56Sopenharmony_ci # More tests are in test_WindowsError 5087db96d56Sopenharmony_ci exceptionList.append( 5097db96d56Sopenharmony_ci (WindowsError, (1, 'strErrorStr', 'filenameStr'), 5107db96d56Sopenharmony_ci {'args' : (1, 'strErrorStr'), 5117db96d56Sopenharmony_ci 'strerror' : 'strErrorStr', 'winerror' : None, 5127db96d56Sopenharmony_ci 'errno' : 1, 5137db96d56Sopenharmony_ci 'filename' : 'filenameStr', 'filename2' : None}) 5147db96d56Sopenharmony_ci ) 5157db96d56Sopenharmony_ci except NameError: 5167db96d56Sopenharmony_ci pass 5177db96d56Sopenharmony_ci 5187db96d56Sopenharmony_ci for exc, args, expected in exceptionList: 5197db96d56Sopenharmony_ci try: 5207db96d56Sopenharmony_ci e = exc(*args) 5217db96d56Sopenharmony_ci except: 5227db96d56Sopenharmony_ci print("\nexc=%r, args=%r" % (exc, args), file=sys.stderr) 5237db96d56Sopenharmony_ci # raise 5247db96d56Sopenharmony_ci else: 5257db96d56Sopenharmony_ci # Verify module name 5267db96d56Sopenharmony_ci if not type(e).__name__.endswith('NaiveException'): 5277db96d56Sopenharmony_ci self.assertEqual(type(e).__module__, 'builtins') 5287db96d56Sopenharmony_ci # Verify no ref leaks in Exc_str() 5297db96d56Sopenharmony_ci s = str(e) 5307db96d56Sopenharmony_ci for checkArgName in expected: 5317db96d56Sopenharmony_ci value = getattr(e, checkArgName) 5327db96d56Sopenharmony_ci self.assertEqual(repr(value), 5337db96d56Sopenharmony_ci repr(expected[checkArgName]), 5347db96d56Sopenharmony_ci '%r.%s == %r, expected %r' % ( 5357db96d56Sopenharmony_ci e, checkArgName, 5367db96d56Sopenharmony_ci value, expected[checkArgName])) 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci # test for pickling support 5397db96d56Sopenharmony_ci for p in [pickle]: 5407db96d56Sopenharmony_ci for protocol in range(p.HIGHEST_PROTOCOL + 1): 5417db96d56Sopenharmony_ci s = p.dumps(e, protocol) 5427db96d56Sopenharmony_ci new = p.loads(s) 5437db96d56Sopenharmony_ci for checkArgName in expected: 5447db96d56Sopenharmony_ci got = repr(getattr(new, checkArgName)) 5457db96d56Sopenharmony_ci want = repr(expected[checkArgName]) 5467db96d56Sopenharmony_ci self.assertEqual(got, want, 5477db96d56Sopenharmony_ci 'pickled "%r", attribute "%s' % 5487db96d56Sopenharmony_ci (e, checkArgName)) 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci def test_notes(self): 5517db96d56Sopenharmony_ci for e in [BaseException(1), Exception(2), ValueError(3)]: 5527db96d56Sopenharmony_ci with self.subTest(e=e): 5537db96d56Sopenharmony_ci self.assertFalse(hasattr(e, '__notes__')) 5547db96d56Sopenharmony_ci e.add_note("My Note") 5557db96d56Sopenharmony_ci self.assertEqual(e.__notes__, ["My Note"]) 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci with self.assertRaises(TypeError): 5587db96d56Sopenharmony_ci e.add_note(42) 5597db96d56Sopenharmony_ci self.assertEqual(e.__notes__, ["My Note"]) 5607db96d56Sopenharmony_ci 5617db96d56Sopenharmony_ci e.add_note("Your Note") 5627db96d56Sopenharmony_ci self.assertEqual(e.__notes__, ["My Note", "Your Note"]) 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci del e.__notes__ 5657db96d56Sopenharmony_ci self.assertFalse(hasattr(e, '__notes__')) 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci e.add_note("Our Note") 5687db96d56Sopenharmony_ci self.assertEqual(e.__notes__, ["Our Note"]) 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci e.__notes__ = 42 5717db96d56Sopenharmony_ci self.assertEqual(e.__notes__, 42) 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci with self.assertRaises(TypeError): 5747db96d56Sopenharmony_ci e.add_note("will not work") 5757db96d56Sopenharmony_ci self.assertEqual(e.__notes__, 42) 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ci def testWithTraceback(self): 5787db96d56Sopenharmony_ci try: 5797db96d56Sopenharmony_ci raise IndexError(4) 5807db96d56Sopenharmony_ci except: 5817db96d56Sopenharmony_ci tb = sys.exc_info()[2] 5827db96d56Sopenharmony_ci 5837db96d56Sopenharmony_ci e = BaseException().with_traceback(tb) 5847db96d56Sopenharmony_ci self.assertIsInstance(e, BaseException) 5857db96d56Sopenharmony_ci self.assertEqual(e.__traceback__, tb) 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci e = IndexError(5).with_traceback(tb) 5887db96d56Sopenharmony_ci self.assertIsInstance(e, IndexError) 5897db96d56Sopenharmony_ci self.assertEqual(e.__traceback__, tb) 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ci class MyException(Exception): 5927db96d56Sopenharmony_ci pass 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci e = MyException().with_traceback(tb) 5957db96d56Sopenharmony_ci self.assertIsInstance(e, MyException) 5967db96d56Sopenharmony_ci self.assertEqual(e.__traceback__, tb) 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci def testInvalidTraceback(self): 5997db96d56Sopenharmony_ci try: 6007db96d56Sopenharmony_ci Exception().__traceback__ = 5 6017db96d56Sopenharmony_ci except TypeError as e: 6027db96d56Sopenharmony_ci self.assertIn("__traceback__ must be a traceback", str(e)) 6037db96d56Sopenharmony_ci else: 6047db96d56Sopenharmony_ci self.fail("No exception raised") 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ci def testInvalidAttrs(self): 6077db96d56Sopenharmony_ci self.assertRaises(TypeError, setattr, Exception(), '__cause__', 1) 6087db96d56Sopenharmony_ci self.assertRaises(TypeError, delattr, Exception(), '__cause__') 6097db96d56Sopenharmony_ci self.assertRaises(TypeError, setattr, Exception(), '__context__', 1) 6107db96d56Sopenharmony_ci self.assertRaises(TypeError, delattr, Exception(), '__context__') 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci def testNoneClearsTracebackAttr(self): 6137db96d56Sopenharmony_ci try: 6147db96d56Sopenharmony_ci raise IndexError(4) 6157db96d56Sopenharmony_ci except: 6167db96d56Sopenharmony_ci tb = sys.exc_info()[2] 6177db96d56Sopenharmony_ci 6187db96d56Sopenharmony_ci e = Exception() 6197db96d56Sopenharmony_ci e.__traceback__ = tb 6207db96d56Sopenharmony_ci e.__traceback__ = None 6217db96d56Sopenharmony_ci self.assertEqual(e.__traceback__, None) 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci def testChainingAttrs(self): 6247db96d56Sopenharmony_ci e = Exception() 6257db96d56Sopenharmony_ci self.assertIsNone(e.__context__) 6267db96d56Sopenharmony_ci self.assertIsNone(e.__cause__) 6277db96d56Sopenharmony_ci 6287db96d56Sopenharmony_ci e = TypeError() 6297db96d56Sopenharmony_ci self.assertIsNone(e.__context__) 6307db96d56Sopenharmony_ci self.assertIsNone(e.__cause__) 6317db96d56Sopenharmony_ci 6327db96d56Sopenharmony_ci class MyException(OSError): 6337db96d56Sopenharmony_ci pass 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci e = MyException() 6367db96d56Sopenharmony_ci self.assertIsNone(e.__context__) 6377db96d56Sopenharmony_ci self.assertIsNone(e.__cause__) 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci def testChainingDescriptors(self): 6407db96d56Sopenharmony_ci try: 6417db96d56Sopenharmony_ci raise Exception() 6427db96d56Sopenharmony_ci except Exception as exc: 6437db96d56Sopenharmony_ci e = exc 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_ci self.assertIsNone(e.__context__) 6467db96d56Sopenharmony_ci self.assertIsNone(e.__cause__) 6477db96d56Sopenharmony_ci self.assertFalse(e.__suppress_context__) 6487db96d56Sopenharmony_ci 6497db96d56Sopenharmony_ci e.__context__ = NameError() 6507db96d56Sopenharmony_ci e.__cause__ = None 6517db96d56Sopenharmony_ci self.assertIsInstance(e.__context__, NameError) 6527db96d56Sopenharmony_ci self.assertIsNone(e.__cause__) 6537db96d56Sopenharmony_ci self.assertTrue(e.__suppress_context__) 6547db96d56Sopenharmony_ci e.__suppress_context__ = False 6557db96d56Sopenharmony_ci self.assertFalse(e.__suppress_context__) 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci def testKeywordArgs(self): 6587db96d56Sopenharmony_ci # test that builtin exception don't take keyword args, 6597db96d56Sopenharmony_ci # but user-defined subclasses can if they want 6607db96d56Sopenharmony_ci self.assertRaises(TypeError, BaseException, a=1) 6617db96d56Sopenharmony_ci 6627db96d56Sopenharmony_ci class DerivedException(BaseException): 6637db96d56Sopenharmony_ci def __init__(self, fancy_arg): 6647db96d56Sopenharmony_ci BaseException.__init__(self) 6657db96d56Sopenharmony_ci self.fancy_arg = fancy_arg 6667db96d56Sopenharmony_ci 6677db96d56Sopenharmony_ci x = DerivedException(fancy_arg=42) 6687db96d56Sopenharmony_ci self.assertEqual(x.fancy_arg, 42) 6697db96d56Sopenharmony_ci 6707db96d56Sopenharmony_ci @no_tracing 6717db96d56Sopenharmony_ci def testInfiniteRecursion(self): 6727db96d56Sopenharmony_ci def f(): 6737db96d56Sopenharmony_ci return f() 6747db96d56Sopenharmony_ci self.assertRaises(RecursionError, f) 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci def g(): 6777db96d56Sopenharmony_ci try: 6787db96d56Sopenharmony_ci return g() 6797db96d56Sopenharmony_ci except ValueError: 6807db96d56Sopenharmony_ci return -1 6817db96d56Sopenharmony_ci self.assertRaises(RecursionError, g) 6827db96d56Sopenharmony_ci 6837db96d56Sopenharmony_ci def test_str(self): 6847db96d56Sopenharmony_ci # Make sure both instances and classes have a str representation. 6857db96d56Sopenharmony_ci self.assertTrue(str(Exception)) 6867db96d56Sopenharmony_ci self.assertTrue(str(Exception('a'))) 6877db96d56Sopenharmony_ci self.assertTrue(str(Exception('a', 'b'))) 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci def test_exception_cleanup_names(self): 6907db96d56Sopenharmony_ci # Make sure the local variable bound to the exception instance by 6917db96d56Sopenharmony_ci # an "except" statement is only visible inside the except block. 6927db96d56Sopenharmony_ci try: 6937db96d56Sopenharmony_ci raise Exception() 6947db96d56Sopenharmony_ci except Exception as e: 6957db96d56Sopenharmony_ci self.assertIsInstance(e, Exception) 6967db96d56Sopenharmony_ci self.assertNotIn('e', locals()) 6977db96d56Sopenharmony_ci with self.assertRaises(UnboundLocalError): 6987db96d56Sopenharmony_ci e 6997db96d56Sopenharmony_ci 7007db96d56Sopenharmony_ci def test_exception_cleanup_names2(self): 7017db96d56Sopenharmony_ci # Make sure the cleanup doesn't break if the variable is explicitly deleted. 7027db96d56Sopenharmony_ci try: 7037db96d56Sopenharmony_ci raise Exception() 7047db96d56Sopenharmony_ci except Exception as e: 7057db96d56Sopenharmony_ci self.assertIsInstance(e, Exception) 7067db96d56Sopenharmony_ci del e 7077db96d56Sopenharmony_ci self.assertNotIn('e', locals()) 7087db96d56Sopenharmony_ci with self.assertRaises(UnboundLocalError): 7097db96d56Sopenharmony_ci e 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_ci def testExceptionCleanupState(self): 7127db96d56Sopenharmony_ci # Make sure exception state is cleaned up as soon as the except 7137db96d56Sopenharmony_ci # block is left. See #2507 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci class MyException(Exception): 7167db96d56Sopenharmony_ci def __init__(self, obj): 7177db96d56Sopenharmony_ci self.obj = obj 7187db96d56Sopenharmony_ci class MyObj: 7197db96d56Sopenharmony_ci pass 7207db96d56Sopenharmony_ci 7217db96d56Sopenharmony_ci def inner_raising_func(): 7227db96d56Sopenharmony_ci # Create some references in exception value and traceback 7237db96d56Sopenharmony_ci local_ref = obj 7247db96d56Sopenharmony_ci raise MyException(obj) 7257db96d56Sopenharmony_ci 7267db96d56Sopenharmony_ci # Qualified "except" with "as" 7277db96d56Sopenharmony_ci obj = MyObj() 7287db96d56Sopenharmony_ci wr = weakref.ref(obj) 7297db96d56Sopenharmony_ci try: 7307db96d56Sopenharmony_ci inner_raising_func() 7317db96d56Sopenharmony_ci except MyException as e: 7327db96d56Sopenharmony_ci pass 7337db96d56Sopenharmony_ci obj = None 7347db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 7357db96d56Sopenharmony_ci obj = wr() 7367db96d56Sopenharmony_ci self.assertIsNone(obj) 7377db96d56Sopenharmony_ci 7387db96d56Sopenharmony_ci # Qualified "except" without "as" 7397db96d56Sopenharmony_ci obj = MyObj() 7407db96d56Sopenharmony_ci wr = weakref.ref(obj) 7417db96d56Sopenharmony_ci try: 7427db96d56Sopenharmony_ci inner_raising_func() 7437db96d56Sopenharmony_ci except MyException: 7447db96d56Sopenharmony_ci pass 7457db96d56Sopenharmony_ci obj = None 7467db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 7477db96d56Sopenharmony_ci obj = wr() 7487db96d56Sopenharmony_ci self.assertIsNone(obj) 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ci # Bare "except" 7517db96d56Sopenharmony_ci obj = MyObj() 7527db96d56Sopenharmony_ci wr = weakref.ref(obj) 7537db96d56Sopenharmony_ci try: 7547db96d56Sopenharmony_ci inner_raising_func() 7557db96d56Sopenharmony_ci except: 7567db96d56Sopenharmony_ci pass 7577db96d56Sopenharmony_ci obj = None 7587db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 7597db96d56Sopenharmony_ci obj = wr() 7607db96d56Sopenharmony_ci self.assertIsNone(obj) 7617db96d56Sopenharmony_ci 7627db96d56Sopenharmony_ci # "except" with premature block leave 7637db96d56Sopenharmony_ci obj = MyObj() 7647db96d56Sopenharmony_ci wr = weakref.ref(obj) 7657db96d56Sopenharmony_ci for i in [0]: 7667db96d56Sopenharmony_ci try: 7677db96d56Sopenharmony_ci inner_raising_func() 7687db96d56Sopenharmony_ci except: 7697db96d56Sopenharmony_ci break 7707db96d56Sopenharmony_ci obj = None 7717db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 7727db96d56Sopenharmony_ci obj = wr() 7737db96d56Sopenharmony_ci self.assertIsNone(obj) 7747db96d56Sopenharmony_ci 7757db96d56Sopenharmony_ci # "except" block raising another exception 7767db96d56Sopenharmony_ci obj = MyObj() 7777db96d56Sopenharmony_ci wr = weakref.ref(obj) 7787db96d56Sopenharmony_ci try: 7797db96d56Sopenharmony_ci try: 7807db96d56Sopenharmony_ci inner_raising_func() 7817db96d56Sopenharmony_ci except: 7827db96d56Sopenharmony_ci raise KeyError 7837db96d56Sopenharmony_ci except KeyError as e: 7847db96d56Sopenharmony_ci # We want to test that the except block above got rid of 7857db96d56Sopenharmony_ci # the exception raised in inner_raising_func(), but it 7867db96d56Sopenharmony_ci # also ends up in the __context__ of the KeyError, so we 7877db96d56Sopenharmony_ci # must clear the latter manually for our test to succeed. 7887db96d56Sopenharmony_ci e.__context__ = None 7897db96d56Sopenharmony_ci obj = None 7907db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 7917db96d56Sopenharmony_ci obj = wr() 7927db96d56Sopenharmony_ci # guarantee no ref cycles on CPython (don't gc_collect) 7937db96d56Sopenharmony_ci if check_impl_detail(cpython=False): 7947db96d56Sopenharmony_ci gc_collect() 7957db96d56Sopenharmony_ci self.assertIsNone(obj) 7967db96d56Sopenharmony_ci 7977db96d56Sopenharmony_ci # Some complicated construct 7987db96d56Sopenharmony_ci obj = MyObj() 7997db96d56Sopenharmony_ci wr = weakref.ref(obj) 8007db96d56Sopenharmony_ci try: 8017db96d56Sopenharmony_ci inner_raising_func() 8027db96d56Sopenharmony_ci except MyException: 8037db96d56Sopenharmony_ci try: 8047db96d56Sopenharmony_ci try: 8057db96d56Sopenharmony_ci raise 8067db96d56Sopenharmony_ci finally: 8077db96d56Sopenharmony_ci raise 8087db96d56Sopenharmony_ci except MyException: 8097db96d56Sopenharmony_ci pass 8107db96d56Sopenharmony_ci obj = None 8117db96d56Sopenharmony_ci if check_impl_detail(cpython=False): 8127db96d56Sopenharmony_ci gc_collect() 8137db96d56Sopenharmony_ci obj = wr() 8147db96d56Sopenharmony_ci self.assertIsNone(obj) 8157db96d56Sopenharmony_ci 8167db96d56Sopenharmony_ci # Inside an exception-silencing "with" block 8177db96d56Sopenharmony_ci class Context: 8187db96d56Sopenharmony_ci def __enter__(self): 8197db96d56Sopenharmony_ci return self 8207db96d56Sopenharmony_ci def __exit__ (self, exc_type, exc_value, exc_tb): 8217db96d56Sopenharmony_ci return True 8227db96d56Sopenharmony_ci obj = MyObj() 8237db96d56Sopenharmony_ci wr = weakref.ref(obj) 8247db96d56Sopenharmony_ci with Context(): 8257db96d56Sopenharmony_ci inner_raising_func() 8267db96d56Sopenharmony_ci obj = None 8277db96d56Sopenharmony_ci if check_impl_detail(cpython=False): 8287db96d56Sopenharmony_ci gc_collect() 8297db96d56Sopenharmony_ci obj = wr() 8307db96d56Sopenharmony_ci self.assertIsNone(obj) 8317db96d56Sopenharmony_ci 8327db96d56Sopenharmony_ci def test_exception_target_in_nested_scope(self): 8337db96d56Sopenharmony_ci # issue 4617: This used to raise a SyntaxError 8347db96d56Sopenharmony_ci # "can not delete variable 'e' referenced in nested scope" 8357db96d56Sopenharmony_ci def print_error(): 8367db96d56Sopenharmony_ci e 8377db96d56Sopenharmony_ci try: 8387db96d56Sopenharmony_ci something 8397db96d56Sopenharmony_ci except Exception as e: 8407db96d56Sopenharmony_ci print_error() 8417db96d56Sopenharmony_ci # implicit "del e" here 8427db96d56Sopenharmony_ci 8437db96d56Sopenharmony_ci def test_generator_leaking(self): 8447db96d56Sopenharmony_ci # Test that generator exception state doesn't leak into the calling 8457db96d56Sopenharmony_ci # frame 8467db96d56Sopenharmony_ci def yield_raise(): 8477db96d56Sopenharmony_ci try: 8487db96d56Sopenharmony_ci raise KeyError("caught") 8497db96d56Sopenharmony_ci except KeyError: 8507db96d56Sopenharmony_ci yield sys.exc_info()[0] 8517db96d56Sopenharmony_ci yield sys.exc_info()[0] 8527db96d56Sopenharmony_ci yield sys.exc_info()[0] 8537db96d56Sopenharmony_ci g = yield_raise() 8547db96d56Sopenharmony_ci self.assertEqual(next(g), KeyError) 8557db96d56Sopenharmony_ci self.assertEqual(sys.exc_info()[0], None) 8567db96d56Sopenharmony_ci self.assertEqual(next(g), KeyError) 8577db96d56Sopenharmony_ci self.assertEqual(sys.exc_info()[0], None) 8587db96d56Sopenharmony_ci self.assertEqual(next(g), None) 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_ci # Same test, but inside an exception handler 8617db96d56Sopenharmony_ci try: 8627db96d56Sopenharmony_ci raise TypeError("foo") 8637db96d56Sopenharmony_ci except TypeError: 8647db96d56Sopenharmony_ci g = yield_raise() 8657db96d56Sopenharmony_ci self.assertEqual(next(g), KeyError) 8667db96d56Sopenharmony_ci self.assertEqual(sys.exc_info()[0], TypeError) 8677db96d56Sopenharmony_ci self.assertEqual(next(g), KeyError) 8687db96d56Sopenharmony_ci self.assertEqual(sys.exc_info()[0], TypeError) 8697db96d56Sopenharmony_ci self.assertEqual(next(g), TypeError) 8707db96d56Sopenharmony_ci del g 8717db96d56Sopenharmony_ci self.assertEqual(sys.exc_info()[0], TypeError) 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci def test_generator_leaking2(self): 8747db96d56Sopenharmony_ci # See issue 12475. 8757db96d56Sopenharmony_ci def g(): 8767db96d56Sopenharmony_ci yield 8777db96d56Sopenharmony_ci try: 8787db96d56Sopenharmony_ci raise RuntimeError 8797db96d56Sopenharmony_ci except RuntimeError: 8807db96d56Sopenharmony_ci it = g() 8817db96d56Sopenharmony_ci next(it) 8827db96d56Sopenharmony_ci try: 8837db96d56Sopenharmony_ci next(it) 8847db96d56Sopenharmony_ci except StopIteration: 8857db96d56Sopenharmony_ci pass 8867db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci def test_generator_leaking3(self): 8897db96d56Sopenharmony_ci # See issue #23353. When gen.throw() is called, the caller's 8907db96d56Sopenharmony_ci # exception state should be save and restored. 8917db96d56Sopenharmony_ci def g(): 8927db96d56Sopenharmony_ci try: 8937db96d56Sopenharmony_ci yield 8947db96d56Sopenharmony_ci except ZeroDivisionError: 8957db96d56Sopenharmony_ci yield sys.exc_info()[1] 8967db96d56Sopenharmony_ci it = g() 8977db96d56Sopenharmony_ci next(it) 8987db96d56Sopenharmony_ci try: 8997db96d56Sopenharmony_ci 1/0 9007db96d56Sopenharmony_ci except ZeroDivisionError as e: 9017db96d56Sopenharmony_ci self.assertIs(sys.exc_info()[1], e) 9027db96d56Sopenharmony_ci gen_exc = it.throw(e) 9037db96d56Sopenharmony_ci self.assertIs(sys.exc_info()[1], e) 9047db96d56Sopenharmony_ci self.assertIs(gen_exc, e) 9057db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ci def test_generator_leaking4(self): 9087db96d56Sopenharmony_ci # See issue #23353. When an exception is raised by a generator, 9097db96d56Sopenharmony_ci # the caller's exception state should still be restored. 9107db96d56Sopenharmony_ci def g(): 9117db96d56Sopenharmony_ci try: 9127db96d56Sopenharmony_ci 1/0 9137db96d56Sopenharmony_ci except ZeroDivisionError: 9147db96d56Sopenharmony_ci yield sys.exc_info()[0] 9157db96d56Sopenharmony_ci raise 9167db96d56Sopenharmony_ci it = g() 9177db96d56Sopenharmony_ci try: 9187db96d56Sopenharmony_ci raise TypeError 9197db96d56Sopenharmony_ci except TypeError: 9207db96d56Sopenharmony_ci # The caller's exception state (TypeError) is temporarily 9217db96d56Sopenharmony_ci # saved in the generator. 9227db96d56Sopenharmony_ci tp = next(it) 9237db96d56Sopenharmony_ci self.assertIs(tp, ZeroDivisionError) 9247db96d56Sopenharmony_ci try: 9257db96d56Sopenharmony_ci next(it) 9267db96d56Sopenharmony_ci # We can't check it immediately, but while next() returns 9277db96d56Sopenharmony_ci # with an exception, it shouldn't have restored the old 9287db96d56Sopenharmony_ci # exception state (TypeError). 9297db96d56Sopenharmony_ci except ZeroDivisionError as e: 9307db96d56Sopenharmony_ci self.assertIs(sys.exc_info()[1], e) 9317db96d56Sopenharmony_ci # We used to find TypeError here. 9327db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 9337db96d56Sopenharmony_ci 9347db96d56Sopenharmony_ci def test_generator_doesnt_retain_old_exc(self): 9357db96d56Sopenharmony_ci def g(): 9367db96d56Sopenharmony_ci self.assertIsInstance(sys.exc_info()[1], RuntimeError) 9377db96d56Sopenharmony_ci yield 9387db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 9397db96d56Sopenharmony_ci it = g() 9407db96d56Sopenharmony_ci try: 9417db96d56Sopenharmony_ci raise RuntimeError 9427db96d56Sopenharmony_ci except RuntimeError: 9437db96d56Sopenharmony_ci next(it) 9447db96d56Sopenharmony_ci self.assertRaises(StopIteration, next, it) 9457db96d56Sopenharmony_ci 9467db96d56Sopenharmony_ci def test_generator_finalizing_and_exc_info(self): 9477db96d56Sopenharmony_ci # See #7173 9487db96d56Sopenharmony_ci def simple_gen(): 9497db96d56Sopenharmony_ci yield 1 9507db96d56Sopenharmony_ci def run_gen(): 9517db96d56Sopenharmony_ci gen = simple_gen() 9527db96d56Sopenharmony_ci try: 9537db96d56Sopenharmony_ci raise RuntimeError 9547db96d56Sopenharmony_ci except RuntimeError: 9557db96d56Sopenharmony_ci return next(gen) 9567db96d56Sopenharmony_ci run_gen() 9577db96d56Sopenharmony_ci gc_collect() 9587db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 9597db96d56Sopenharmony_ci 9607db96d56Sopenharmony_ci def _check_generator_cleanup_exc_state(self, testfunc): 9617db96d56Sopenharmony_ci # Issue #12791: exception state is cleaned up as soon as a generator 9627db96d56Sopenharmony_ci # is closed (reference cycles are broken). 9637db96d56Sopenharmony_ci class MyException(Exception): 9647db96d56Sopenharmony_ci def __init__(self, obj): 9657db96d56Sopenharmony_ci self.obj = obj 9667db96d56Sopenharmony_ci class MyObj: 9677db96d56Sopenharmony_ci pass 9687db96d56Sopenharmony_ci 9697db96d56Sopenharmony_ci def raising_gen(): 9707db96d56Sopenharmony_ci try: 9717db96d56Sopenharmony_ci raise MyException(obj) 9727db96d56Sopenharmony_ci except MyException: 9737db96d56Sopenharmony_ci yield 9747db96d56Sopenharmony_ci 9757db96d56Sopenharmony_ci obj = MyObj() 9767db96d56Sopenharmony_ci wr = weakref.ref(obj) 9777db96d56Sopenharmony_ci g = raising_gen() 9787db96d56Sopenharmony_ci next(g) 9797db96d56Sopenharmony_ci testfunc(g) 9807db96d56Sopenharmony_ci g = obj = None 9817db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 9827db96d56Sopenharmony_ci obj = wr() 9837db96d56Sopenharmony_ci self.assertIsNone(obj) 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci def test_generator_throw_cleanup_exc_state(self): 9867db96d56Sopenharmony_ci def do_throw(g): 9877db96d56Sopenharmony_ci try: 9887db96d56Sopenharmony_ci g.throw(RuntimeError()) 9897db96d56Sopenharmony_ci except RuntimeError: 9907db96d56Sopenharmony_ci pass 9917db96d56Sopenharmony_ci self._check_generator_cleanup_exc_state(do_throw) 9927db96d56Sopenharmony_ci 9937db96d56Sopenharmony_ci def test_generator_close_cleanup_exc_state(self): 9947db96d56Sopenharmony_ci def do_close(g): 9957db96d56Sopenharmony_ci g.close() 9967db96d56Sopenharmony_ci self._check_generator_cleanup_exc_state(do_close) 9977db96d56Sopenharmony_ci 9987db96d56Sopenharmony_ci def test_generator_del_cleanup_exc_state(self): 9997db96d56Sopenharmony_ci def do_del(g): 10007db96d56Sopenharmony_ci g = None 10017db96d56Sopenharmony_ci self._check_generator_cleanup_exc_state(do_del) 10027db96d56Sopenharmony_ci 10037db96d56Sopenharmony_ci def test_generator_next_cleanup_exc_state(self): 10047db96d56Sopenharmony_ci def do_next(g): 10057db96d56Sopenharmony_ci try: 10067db96d56Sopenharmony_ci next(g) 10077db96d56Sopenharmony_ci except StopIteration: 10087db96d56Sopenharmony_ci pass 10097db96d56Sopenharmony_ci else: 10107db96d56Sopenharmony_ci self.fail("should have raised StopIteration") 10117db96d56Sopenharmony_ci self._check_generator_cleanup_exc_state(do_next) 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci def test_generator_send_cleanup_exc_state(self): 10147db96d56Sopenharmony_ci def do_send(g): 10157db96d56Sopenharmony_ci try: 10167db96d56Sopenharmony_ci g.send(None) 10177db96d56Sopenharmony_ci except StopIteration: 10187db96d56Sopenharmony_ci pass 10197db96d56Sopenharmony_ci else: 10207db96d56Sopenharmony_ci self.fail("should have raised StopIteration") 10217db96d56Sopenharmony_ci self._check_generator_cleanup_exc_state(do_send) 10227db96d56Sopenharmony_ci 10237db96d56Sopenharmony_ci def test_3114(self): 10247db96d56Sopenharmony_ci # Bug #3114: in its destructor, MyObject retrieves a pointer to 10257db96d56Sopenharmony_ci # obsolete and/or deallocated objects. 10267db96d56Sopenharmony_ci class MyObject: 10277db96d56Sopenharmony_ci def __del__(self): 10287db96d56Sopenharmony_ci nonlocal e 10297db96d56Sopenharmony_ci e = sys.exc_info() 10307db96d56Sopenharmony_ci e = () 10317db96d56Sopenharmony_ci try: 10327db96d56Sopenharmony_ci raise Exception(MyObject()) 10337db96d56Sopenharmony_ci except: 10347db96d56Sopenharmony_ci pass 10357db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 10367db96d56Sopenharmony_ci self.assertEqual(e, (None, None, None)) 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ci def test_raise_does_not_create_context_chain_cycle(self): 10397db96d56Sopenharmony_ci class A(Exception): 10407db96d56Sopenharmony_ci pass 10417db96d56Sopenharmony_ci class B(Exception): 10427db96d56Sopenharmony_ci pass 10437db96d56Sopenharmony_ci class C(Exception): 10447db96d56Sopenharmony_ci pass 10457db96d56Sopenharmony_ci 10467db96d56Sopenharmony_ci # Create a context chain: 10477db96d56Sopenharmony_ci # C -> B -> A 10487db96d56Sopenharmony_ci # Then raise A in context of C. 10497db96d56Sopenharmony_ci try: 10507db96d56Sopenharmony_ci try: 10517db96d56Sopenharmony_ci raise A 10527db96d56Sopenharmony_ci except A as a_: 10537db96d56Sopenharmony_ci a = a_ 10547db96d56Sopenharmony_ci try: 10557db96d56Sopenharmony_ci raise B 10567db96d56Sopenharmony_ci except B as b_: 10577db96d56Sopenharmony_ci b = b_ 10587db96d56Sopenharmony_ci try: 10597db96d56Sopenharmony_ci raise C 10607db96d56Sopenharmony_ci except C as c_: 10617db96d56Sopenharmony_ci c = c_ 10627db96d56Sopenharmony_ci self.assertIsInstance(a, A) 10637db96d56Sopenharmony_ci self.assertIsInstance(b, B) 10647db96d56Sopenharmony_ci self.assertIsInstance(c, C) 10657db96d56Sopenharmony_ci self.assertIsNone(a.__context__) 10667db96d56Sopenharmony_ci self.assertIs(b.__context__, a) 10677db96d56Sopenharmony_ci self.assertIs(c.__context__, b) 10687db96d56Sopenharmony_ci raise a 10697db96d56Sopenharmony_ci except A as e: 10707db96d56Sopenharmony_ci exc = e 10717db96d56Sopenharmony_ci 10727db96d56Sopenharmony_ci # Expect A -> C -> B, without cycle 10737db96d56Sopenharmony_ci self.assertIs(exc, a) 10747db96d56Sopenharmony_ci self.assertIs(a.__context__, c) 10757db96d56Sopenharmony_ci self.assertIs(c.__context__, b) 10767db96d56Sopenharmony_ci self.assertIsNone(b.__context__) 10777db96d56Sopenharmony_ci 10787db96d56Sopenharmony_ci def test_no_hang_on_context_chain_cycle1(self): 10797db96d56Sopenharmony_ci # See issue 25782. Cycle in context chain. 10807db96d56Sopenharmony_ci 10817db96d56Sopenharmony_ci def cycle(): 10827db96d56Sopenharmony_ci try: 10837db96d56Sopenharmony_ci raise ValueError(1) 10847db96d56Sopenharmony_ci except ValueError as ex: 10857db96d56Sopenharmony_ci ex.__context__ = ex 10867db96d56Sopenharmony_ci raise TypeError(2) 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci try: 10897db96d56Sopenharmony_ci cycle() 10907db96d56Sopenharmony_ci except Exception as e: 10917db96d56Sopenharmony_ci exc = e 10927db96d56Sopenharmony_ci 10937db96d56Sopenharmony_ci self.assertIsInstance(exc, TypeError) 10947db96d56Sopenharmony_ci self.assertIsInstance(exc.__context__, ValueError) 10957db96d56Sopenharmony_ci self.assertIs(exc.__context__.__context__, exc.__context__) 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci @unittest.skip("See issue 44895") 10987db96d56Sopenharmony_ci def test_no_hang_on_context_chain_cycle2(self): 10997db96d56Sopenharmony_ci # See issue 25782. Cycle at head of context chain. 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci class A(Exception): 11027db96d56Sopenharmony_ci pass 11037db96d56Sopenharmony_ci class B(Exception): 11047db96d56Sopenharmony_ci pass 11057db96d56Sopenharmony_ci class C(Exception): 11067db96d56Sopenharmony_ci pass 11077db96d56Sopenharmony_ci 11087db96d56Sopenharmony_ci # Context cycle: 11097db96d56Sopenharmony_ci # +-----------+ 11107db96d56Sopenharmony_ci # V | 11117db96d56Sopenharmony_ci # C --> B --> A 11127db96d56Sopenharmony_ci with self.assertRaises(C) as cm: 11137db96d56Sopenharmony_ci try: 11147db96d56Sopenharmony_ci raise A() 11157db96d56Sopenharmony_ci except A as _a: 11167db96d56Sopenharmony_ci a = _a 11177db96d56Sopenharmony_ci try: 11187db96d56Sopenharmony_ci raise B() 11197db96d56Sopenharmony_ci except B as _b: 11207db96d56Sopenharmony_ci b = _b 11217db96d56Sopenharmony_ci try: 11227db96d56Sopenharmony_ci raise C() 11237db96d56Sopenharmony_ci except C as _c: 11247db96d56Sopenharmony_ci c = _c 11257db96d56Sopenharmony_ci a.__context__ = c 11267db96d56Sopenharmony_ci raise c 11277db96d56Sopenharmony_ci 11287db96d56Sopenharmony_ci self.assertIs(cm.exception, c) 11297db96d56Sopenharmony_ci # Verify the expected context chain cycle 11307db96d56Sopenharmony_ci self.assertIs(c.__context__, b) 11317db96d56Sopenharmony_ci self.assertIs(b.__context__, a) 11327db96d56Sopenharmony_ci self.assertIs(a.__context__, c) 11337db96d56Sopenharmony_ci 11347db96d56Sopenharmony_ci def test_no_hang_on_context_chain_cycle3(self): 11357db96d56Sopenharmony_ci # See issue 25782. Longer context chain with cycle. 11367db96d56Sopenharmony_ci 11377db96d56Sopenharmony_ci class A(Exception): 11387db96d56Sopenharmony_ci pass 11397db96d56Sopenharmony_ci class B(Exception): 11407db96d56Sopenharmony_ci pass 11417db96d56Sopenharmony_ci class C(Exception): 11427db96d56Sopenharmony_ci pass 11437db96d56Sopenharmony_ci class D(Exception): 11447db96d56Sopenharmony_ci pass 11457db96d56Sopenharmony_ci class E(Exception): 11467db96d56Sopenharmony_ci pass 11477db96d56Sopenharmony_ci 11487db96d56Sopenharmony_ci # Context cycle: 11497db96d56Sopenharmony_ci # +-----------+ 11507db96d56Sopenharmony_ci # V | 11517db96d56Sopenharmony_ci # E --> D --> C --> B --> A 11527db96d56Sopenharmony_ci with self.assertRaises(E) as cm: 11537db96d56Sopenharmony_ci try: 11547db96d56Sopenharmony_ci raise A() 11557db96d56Sopenharmony_ci except A as _a: 11567db96d56Sopenharmony_ci a = _a 11577db96d56Sopenharmony_ci try: 11587db96d56Sopenharmony_ci raise B() 11597db96d56Sopenharmony_ci except B as _b: 11607db96d56Sopenharmony_ci b = _b 11617db96d56Sopenharmony_ci try: 11627db96d56Sopenharmony_ci raise C() 11637db96d56Sopenharmony_ci except C as _c: 11647db96d56Sopenharmony_ci c = _c 11657db96d56Sopenharmony_ci a.__context__ = c 11667db96d56Sopenharmony_ci try: 11677db96d56Sopenharmony_ci raise D() 11687db96d56Sopenharmony_ci except D as _d: 11697db96d56Sopenharmony_ci d = _d 11707db96d56Sopenharmony_ci e = E() 11717db96d56Sopenharmony_ci raise e 11727db96d56Sopenharmony_ci 11737db96d56Sopenharmony_ci self.assertIs(cm.exception, e) 11747db96d56Sopenharmony_ci # Verify the expected context chain cycle 11757db96d56Sopenharmony_ci self.assertIs(e.__context__, d) 11767db96d56Sopenharmony_ci self.assertIs(d.__context__, c) 11777db96d56Sopenharmony_ci self.assertIs(c.__context__, b) 11787db96d56Sopenharmony_ci self.assertIs(b.__context__, a) 11797db96d56Sopenharmony_ci self.assertIs(a.__context__, c) 11807db96d56Sopenharmony_ci 11817db96d56Sopenharmony_ci def test_context_of_exception_in_try_and_finally(self): 11827db96d56Sopenharmony_ci try: 11837db96d56Sopenharmony_ci try: 11847db96d56Sopenharmony_ci te = TypeError(1) 11857db96d56Sopenharmony_ci raise te 11867db96d56Sopenharmony_ci finally: 11877db96d56Sopenharmony_ci ve = ValueError(2) 11887db96d56Sopenharmony_ci raise ve 11897db96d56Sopenharmony_ci except Exception as e: 11907db96d56Sopenharmony_ci exc = e 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci self.assertIs(exc, ve) 11937db96d56Sopenharmony_ci self.assertIs(exc.__context__, te) 11947db96d56Sopenharmony_ci 11957db96d56Sopenharmony_ci def test_context_of_exception_in_except_and_finally(self): 11967db96d56Sopenharmony_ci try: 11977db96d56Sopenharmony_ci try: 11987db96d56Sopenharmony_ci te = TypeError(1) 11997db96d56Sopenharmony_ci raise te 12007db96d56Sopenharmony_ci except: 12017db96d56Sopenharmony_ci ve = ValueError(2) 12027db96d56Sopenharmony_ci raise ve 12037db96d56Sopenharmony_ci finally: 12047db96d56Sopenharmony_ci oe = OSError(3) 12057db96d56Sopenharmony_ci raise oe 12067db96d56Sopenharmony_ci except Exception as e: 12077db96d56Sopenharmony_ci exc = e 12087db96d56Sopenharmony_ci 12097db96d56Sopenharmony_ci self.assertIs(exc, oe) 12107db96d56Sopenharmony_ci self.assertIs(exc.__context__, ve) 12117db96d56Sopenharmony_ci self.assertIs(exc.__context__.__context__, te) 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci def test_context_of_exception_in_else_and_finally(self): 12147db96d56Sopenharmony_ci try: 12157db96d56Sopenharmony_ci try: 12167db96d56Sopenharmony_ci pass 12177db96d56Sopenharmony_ci except: 12187db96d56Sopenharmony_ci pass 12197db96d56Sopenharmony_ci else: 12207db96d56Sopenharmony_ci ve = ValueError(1) 12217db96d56Sopenharmony_ci raise ve 12227db96d56Sopenharmony_ci finally: 12237db96d56Sopenharmony_ci oe = OSError(2) 12247db96d56Sopenharmony_ci raise oe 12257db96d56Sopenharmony_ci except Exception as e: 12267db96d56Sopenharmony_ci exc = e 12277db96d56Sopenharmony_ci 12287db96d56Sopenharmony_ci self.assertIs(exc, oe) 12297db96d56Sopenharmony_ci self.assertIs(exc.__context__, ve) 12307db96d56Sopenharmony_ci 12317db96d56Sopenharmony_ci def test_unicode_change_attributes(self): 12327db96d56Sopenharmony_ci # See issue 7309. This was a crasher. 12337db96d56Sopenharmony_ci 12347db96d56Sopenharmony_ci u = UnicodeEncodeError('baz', 'xxxxx', 1, 5, 'foo') 12357db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: foo") 12367db96d56Sopenharmony_ci u.end = 2 12377db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't encode character '\\x78' in position 1: foo") 12387db96d56Sopenharmony_ci u.end = 5 12397db96d56Sopenharmony_ci u.reason = 0x345345345345345345 12407db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: 965230951443685724997") 12417db96d56Sopenharmony_ci u.encoding = 4000 12427db96d56Sopenharmony_ci self.assertEqual(str(u), "'4000' codec can't encode characters in position 1-4: 965230951443685724997") 12437db96d56Sopenharmony_ci u.start = 1000 12447db96d56Sopenharmony_ci self.assertEqual(str(u), "'4000' codec can't encode characters in position 1000-4: 965230951443685724997") 12457db96d56Sopenharmony_ci 12467db96d56Sopenharmony_ci u = UnicodeDecodeError('baz', b'xxxxx', 1, 5, 'foo') 12477db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: foo") 12487db96d56Sopenharmony_ci u.end = 2 12497db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't decode byte 0x78 in position 1: foo") 12507db96d56Sopenharmony_ci u.end = 5 12517db96d56Sopenharmony_ci u.reason = 0x345345345345345345 12527db96d56Sopenharmony_ci self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: 965230951443685724997") 12537db96d56Sopenharmony_ci u.encoding = 4000 12547db96d56Sopenharmony_ci self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1-4: 965230951443685724997") 12557db96d56Sopenharmony_ci u.start = 1000 12567db96d56Sopenharmony_ci self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1000-4: 965230951443685724997") 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ci u = UnicodeTranslateError('xxxx', 1, 5, 'foo') 12597db96d56Sopenharmony_ci self.assertEqual(str(u), "can't translate characters in position 1-4: foo") 12607db96d56Sopenharmony_ci u.end = 2 12617db96d56Sopenharmony_ci self.assertEqual(str(u), "can't translate character '\\x78' in position 1: foo") 12627db96d56Sopenharmony_ci u.end = 5 12637db96d56Sopenharmony_ci u.reason = 0x345345345345345345 12647db96d56Sopenharmony_ci self.assertEqual(str(u), "can't translate characters in position 1-4: 965230951443685724997") 12657db96d56Sopenharmony_ci u.start = 1000 12667db96d56Sopenharmony_ci self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997") 12677db96d56Sopenharmony_ci 12687db96d56Sopenharmony_ci def test_unicode_errors_no_object(self): 12697db96d56Sopenharmony_ci # See issue #21134. 12707db96d56Sopenharmony_ci klasses = UnicodeEncodeError, UnicodeDecodeError, UnicodeTranslateError 12717db96d56Sopenharmony_ci for klass in klasses: 12727db96d56Sopenharmony_ci self.assertEqual(str(klass.__new__(klass)), "") 12737db96d56Sopenharmony_ci 12747db96d56Sopenharmony_ci @no_tracing 12757db96d56Sopenharmony_ci def test_badisinstance(self): 12767db96d56Sopenharmony_ci # Bug #2542: if issubclass(e, MyException) raises an exception, 12777db96d56Sopenharmony_ci # it should be ignored 12787db96d56Sopenharmony_ci class Meta(type): 12797db96d56Sopenharmony_ci def __subclasscheck__(cls, subclass): 12807db96d56Sopenharmony_ci raise ValueError() 12817db96d56Sopenharmony_ci class MyException(Exception, metaclass=Meta): 12827db96d56Sopenharmony_ci pass 12837db96d56Sopenharmony_ci 12847db96d56Sopenharmony_ci with captured_stderr() as stderr: 12857db96d56Sopenharmony_ci try: 12867db96d56Sopenharmony_ci raise KeyError() 12877db96d56Sopenharmony_ci except MyException as e: 12887db96d56Sopenharmony_ci self.fail("exception should not be a MyException") 12897db96d56Sopenharmony_ci except KeyError: 12907db96d56Sopenharmony_ci pass 12917db96d56Sopenharmony_ci except: 12927db96d56Sopenharmony_ci self.fail("Should have raised KeyError") 12937db96d56Sopenharmony_ci else: 12947db96d56Sopenharmony_ci self.fail("Should have raised KeyError") 12957db96d56Sopenharmony_ci 12967db96d56Sopenharmony_ci def g(): 12977db96d56Sopenharmony_ci try: 12987db96d56Sopenharmony_ci return g() 12997db96d56Sopenharmony_ci except RecursionError: 13007db96d56Sopenharmony_ci return sys.exc_info() 13017db96d56Sopenharmony_ci e, v, tb = g() 13027db96d56Sopenharmony_ci self.assertIsInstance(v, RecursionError, type(v)) 13037db96d56Sopenharmony_ci self.assertIn("maximum recursion depth exceeded", str(v)) 13047db96d56Sopenharmony_ci 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_ci @cpython_only 13077db96d56Sopenharmony_ci def test_trashcan_recursion(self): 13087db96d56Sopenharmony_ci # See bpo-33930 13097db96d56Sopenharmony_ci 13107db96d56Sopenharmony_ci def foo(): 13117db96d56Sopenharmony_ci o = object() 13127db96d56Sopenharmony_ci for x in range(1_000_000): 13137db96d56Sopenharmony_ci # Create a big chain of method objects that will trigger 13147db96d56Sopenharmony_ci # a deep chain of calls when they need to be destructed. 13157db96d56Sopenharmony_ci o = o.__dir__ 13167db96d56Sopenharmony_ci 13177db96d56Sopenharmony_ci foo() 13187db96d56Sopenharmony_ci support.gc_collect() 13197db96d56Sopenharmony_ci 13207db96d56Sopenharmony_ci @cpython_only 13217db96d56Sopenharmony_ci def test_recursion_normalizing_exception(self): 13227db96d56Sopenharmony_ci # Issue #22898. 13237db96d56Sopenharmony_ci # Test that a RecursionError is raised when tstate->recursion_depth is 13247db96d56Sopenharmony_ci # equal to recursion_limit in PyErr_NormalizeException() and check 13257db96d56Sopenharmony_ci # that a ResourceWarning is printed. 13267db96d56Sopenharmony_ci # Prior to #22898, the recursivity of PyErr_NormalizeException() was 13277db96d56Sopenharmony_ci # controlled by tstate->recursion_depth and a PyExc_RecursionErrorInst 13287db96d56Sopenharmony_ci # singleton was being used in that case, that held traceback data and 13297db96d56Sopenharmony_ci # locals indefinitely and would cause a segfault in _PyExc_Fini() upon 13307db96d56Sopenharmony_ci # finalization of these locals. 13317db96d56Sopenharmony_ci code = """if 1: 13327db96d56Sopenharmony_ci import sys 13337db96d56Sopenharmony_ci from _testinternalcapi import get_recursion_depth 13347db96d56Sopenharmony_ci 13357db96d56Sopenharmony_ci class MyException(Exception): pass 13367db96d56Sopenharmony_ci 13377db96d56Sopenharmony_ci def setrecursionlimit(depth): 13387db96d56Sopenharmony_ci while 1: 13397db96d56Sopenharmony_ci try: 13407db96d56Sopenharmony_ci sys.setrecursionlimit(depth) 13417db96d56Sopenharmony_ci return depth 13427db96d56Sopenharmony_ci except RecursionError: 13437db96d56Sopenharmony_ci # sys.setrecursionlimit() raises a RecursionError if 13447db96d56Sopenharmony_ci # the new recursion limit is too low (issue #25274). 13457db96d56Sopenharmony_ci depth += 1 13467db96d56Sopenharmony_ci 13477db96d56Sopenharmony_ci def recurse(cnt): 13487db96d56Sopenharmony_ci cnt -= 1 13497db96d56Sopenharmony_ci if cnt: 13507db96d56Sopenharmony_ci recurse(cnt) 13517db96d56Sopenharmony_ci else: 13527db96d56Sopenharmony_ci generator.throw(MyException) 13537db96d56Sopenharmony_ci 13547db96d56Sopenharmony_ci def gen(): 13557db96d56Sopenharmony_ci f = open(%a, mode='rb', buffering=0) 13567db96d56Sopenharmony_ci yield 13577db96d56Sopenharmony_ci 13587db96d56Sopenharmony_ci generator = gen() 13597db96d56Sopenharmony_ci next(generator) 13607db96d56Sopenharmony_ci recursionlimit = sys.getrecursionlimit() 13617db96d56Sopenharmony_ci depth = get_recursion_depth() 13627db96d56Sopenharmony_ci try: 13637db96d56Sopenharmony_ci # Upon the last recursive invocation of recurse(), 13647db96d56Sopenharmony_ci # tstate->recursion_depth is equal to (recursion_limit - 1) 13657db96d56Sopenharmony_ci # and is equal to recursion_limit when _gen_throw() calls 13667db96d56Sopenharmony_ci # PyErr_NormalizeException(). 13677db96d56Sopenharmony_ci recurse(setrecursionlimit(depth + 2) - depth) 13687db96d56Sopenharmony_ci finally: 13697db96d56Sopenharmony_ci sys.setrecursionlimit(recursionlimit) 13707db96d56Sopenharmony_ci print('Done.') 13717db96d56Sopenharmony_ci """ % __file__ 13727db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure("-Wd", "-c", code) 13737db96d56Sopenharmony_ci # Check that the program does not fail with SIGABRT. 13747db96d56Sopenharmony_ci self.assertEqual(rc, 1) 13757db96d56Sopenharmony_ci self.assertIn(b'RecursionError', err) 13767db96d56Sopenharmony_ci self.assertIn(b'ResourceWarning', err) 13777db96d56Sopenharmony_ci self.assertIn(b'Done.', out) 13787db96d56Sopenharmony_ci 13797db96d56Sopenharmony_ci @cpython_only 13807db96d56Sopenharmony_ci def test_recursion_normalizing_infinite_exception(self): 13817db96d56Sopenharmony_ci # Issue #30697. Test that a RecursionError is raised when 13827db96d56Sopenharmony_ci # PyErr_NormalizeException() maximum recursion depth has been 13837db96d56Sopenharmony_ci # exceeded. 13847db96d56Sopenharmony_ci code = """if 1: 13857db96d56Sopenharmony_ci import _testcapi 13867db96d56Sopenharmony_ci try: 13877db96d56Sopenharmony_ci raise _testcapi.RecursingInfinitelyError 13887db96d56Sopenharmony_ci finally: 13897db96d56Sopenharmony_ci print('Done.') 13907db96d56Sopenharmony_ci """ 13917db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure("-c", code) 13927db96d56Sopenharmony_ci self.assertEqual(rc, 1) 13937db96d56Sopenharmony_ci self.assertIn(b'RecursionError: maximum recursion depth exceeded ' 13947db96d56Sopenharmony_ci b'while normalizing an exception', err) 13957db96d56Sopenharmony_ci self.assertIn(b'Done.', out) 13967db96d56Sopenharmony_ci 13977db96d56Sopenharmony_ci 13987db96d56Sopenharmony_ci def test_recursion_in_except_handler(self): 13997db96d56Sopenharmony_ci 14007db96d56Sopenharmony_ci def set_relative_recursion_limit(n): 14017db96d56Sopenharmony_ci depth = 1 14027db96d56Sopenharmony_ci while True: 14037db96d56Sopenharmony_ci try: 14047db96d56Sopenharmony_ci sys.setrecursionlimit(depth) 14057db96d56Sopenharmony_ci except RecursionError: 14067db96d56Sopenharmony_ci depth += 1 14077db96d56Sopenharmony_ci else: 14087db96d56Sopenharmony_ci break 14097db96d56Sopenharmony_ci sys.setrecursionlimit(depth+n) 14107db96d56Sopenharmony_ci 14117db96d56Sopenharmony_ci def recurse_in_except(): 14127db96d56Sopenharmony_ci try: 14137db96d56Sopenharmony_ci 1/0 14147db96d56Sopenharmony_ci except: 14157db96d56Sopenharmony_ci recurse_in_except() 14167db96d56Sopenharmony_ci 14177db96d56Sopenharmony_ci def recurse_after_except(): 14187db96d56Sopenharmony_ci try: 14197db96d56Sopenharmony_ci 1/0 14207db96d56Sopenharmony_ci except: 14217db96d56Sopenharmony_ci pass 14227db96d56Sopenharmony_ci recurse_after_except() 14237db96d56Sopenharmony_ci 14247db96d56Sopenharmony_ci def recurse_in_body_and_except(): 14257db96d56Sopenharmony_ci try: 14267db96d56Sopenharmony_ci recurse_in_body_and_except() 14277db96d56Sopenharmony_ci except: 14287db96d56Sopenharmony_ci recurse_in_body_and_except() 14297db96d56Sopenharmony_ci 14307db96d56Sopenharmony_ci recursionlimit = sys.getrecursionlimit() 14317db96d56Sopenharmony_ci try: 14327db96d56Sopenharmony_ci set_relative_recursion_limit(10) 14337db96d56Sopenharmony_ci for func in (recurse_in_except, recurse_after_except, recurse_in_body_and_except): 14347db96d56Sopenharmony_ci with self.subTest(func=func): 14357db96d56Sopenharmony_ci try: 14367db96d56Sopenharmony_ci func() 14377db96d56Sopenharmony_ci except RecursionError: 14387db96d56Sopenharmony_ci pass 14397db96d56Sopenharmony_ci else: 14407db96d56Sopenharmony_ci self.fail("Should have raised a RecursionError") 14417db96d56Sopenharmony_ci finally: 14427db96d56Sopenharmony_ci sys.setrecursionlimit(recursionlimit) 14437db96d56Sopenharmony_ci 14447db96d56Sopenharmony_ci 14457db96d56Sopenharmony_ci @cpython_only 14467db96d56Sopenharmony_ci def test_recursion_normalizing_with_no_memory(self): 14477db96d56Sopenharmony_ci # Issue #30697. Test that in the abort that occurs when there is no 14487db96d56Sopenharmony_ci # memory left and the size of the Python frames stack is greater than 14497db96d56Sopenharmony_ci # the size of the list of preallocated MemoryError instances, the 14507db96d56Sopenharmony_ci # Fatal Python error message mentions MemoryError. 14517db96d56Sopenharmony_ci code = """if 1: 14527db96d56Sopenharmony_ci import _testcapi 14537db96d56Sopenharmony_ci class C(): pass 14547db96d56Sopenharmony_ci def recurse(cnt): 14557db96d56Sopenharmony_ci cnt -= 1 14567db96d56Sopenharmony_ci if cnt: 14577db96d56Sopenharmony_ci recurse(cnt) 14587db96d56Sopenharmony_ci else: 14597db96d56Sopenharmony_ci _testcapi.set_nomemory(0) 14607db96d56Sopenharmony_ci C() 14617db96d56Sopenharmony_ci recurse(16) 14627db96d56Sopenharmony_ci """ 14637db96d56Sopenharmony_ci with SuppressCrashReport(): 14647db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure("-c", code) 14657db96d56Sopenharmony_ci self.assertIn(b'MemoryError', err) 14667db96d56Sopenharmony_ci 14677db96d56Sopenharmony_ci @cpython_only 14687db96d56Sopenharmony_ci def test_MemoryError(self): 14697db96d56Sopenharmony_ci # PyErr_NoMemory always raises the same exception instance. 14707db96d56Sopenharmony_ci # Check that the traceback is not doubled. 14717db96d56Sopenharmony_ci import traceback 14727db96d56Sopenharmony_ci from _testcapi import raise_memoryerror 14737db96d56Sopenharmony_ci def raiseMemError(): 14747db96d56Sopenharmony_ci try: 14757db96d56Sopenharmony_ci raise_memoryerror() 14767db96d56Sopenharmony_ci except MemoryError as e: 14777db96d56Sopenharmony_ci tb = e.__traceback__ 14787db96d56Sopenharmony_ci else: 14797db96d56Sopenharmony_ci self.fail("Should have raised a MemoryError") 14807db96d56Sopenharmony_ci return traceback.format_tb(tb) 14817db96d56Sopenharmony_ci 14827db96d56Sopenharmony_ci tb1 = raiseMemError() 14837db96d56Sopenharmony_ci tb2 = raiseMemError() 14847db96d56Sopenharmony_ci self.assertEqual(tb1, tb2) 14857db96d56Sopenharmony_ci 14867db96d56Sopenharmony_ci @cpython_only 14877db96d56Sopenharmony_ci def test_exception_with_doc(self): 14887db96d56Sopenharmony_ci import _testcapi 14897db96d56Sopenharmony_ci doc2 = "This is a test docstring." 14907db96d56Sopenharmony_ci doc4 = "This is another test docstring." 14917db96d56Sopenharmony_ci 14927db96d56Sopenharmony_ci self.assertRaises(SystemError, _testcapi.make_exception_with_doc, 14937db96d56Sopenharmony_ci "error1") 14947db96d56Sopenharmony_ci 14957db96d56Sopenharmony_ci # test basic usage of PyErr_NewException 14967db96d56Sopenharmony_ci error1 = _testcapi.make_exception_with_doc("_testcapi.error1") 14977db96d56Sopenharmony_ci self.assertIs(type(error1), type) 14987db96d56Sopenharmony_ci self.assertTrue(issubclass(error1, Exception)) 14997db96d56Sopenharmony_ci self.assertIsNone(error1.__doc__) 15007db96d56Sopenharmony_ci 15017db96d56Sopenharmony_ci # test with given docstring 15027db96d56Sopenharmony_ci error2 = _testcapi.make_exception_with_doc("_testcapi.error2", doc2) 15037db96d56Sopenharmony_ci self.assertEqual(error2.__doc__, doc2) 15047db96d56Sopenharmony_ci 15057db96d56Sopenharmony_ci # test with explicit base (without docstring) 15067db96d56Sopenharmony_ci error3 = _testcapi.make_exception_with_doc("_testcapi.error3", 15077db96d56Sopenharmony_ci base=error2) 15087db96d56Sopenharmony_ci self.assertTrue(issubclass(error3, error2)) 15097db96d56Sopenharmony_ci 15107db96d56Sopenharmony_ci # test with explicit base tuple 15117db96d56Sopenharmony_ci class C(object): 15127db96d56Sopenharmony_ci pass 15137db96d56Sopenharmony_ci error4 = _testcapi.make_exception_with_doc("_testcapi.error4", doc4, 15147db96d56Sopenharmony_ci (error3, C)) 15157db96d56Sopenharmony_ci self.assertTrue(issubclass(error4, error3)) 15167db96d56Sopenharmony_ci self.assertTrue(issubclass(error4, C)) 15177db96d56Sopenharmony_ci self.assertEqual(error4.__doc__, doc4) 15187db96d56Sopenharmony_ci 15197db96d56Sopenharmony_ci # test with explicit dictionary 15207db96d56Sopenharmony_ci error5 = _testcapi.make_exception_with_doc("_testcapi.error5", "", 15217db96d56Sopenharmony_ci error4, {'a': 1}) 15227db96d56Sopenharmony_ci self.assertTrue(issubclass(error5, error4)) 15237db96d56Sopenharmony_ci self.assertEqual(error5.a, 1) 15247db96d56Sopenharmony_ci self.assertEqual(error5.__doc__, "") 15257db96d56Sopenharmony_ci 15267db96d56Sopenharmony_ci @cpython_only 15277db96d56Sopenharmony_ci def test_memory_error_cleanup(self): 15287db96d56Sopenharmony_ci # Issue #5437: preallocated MemoryError instances should not keep 15297db96d56Sopenharmony_ci # traceback objects alive. 15307db96d56Sopenharmony_ci from _testcapi import raise_memoryerror 15317db96d56Sopenharmony_ci class C: 15327db96d56Sopenharmony_ci pass 15337db96d56Sopenharmony_ci wr = None 15347db96d56Sopenharmony_ci def inner(): 15357db96d56Sopenharmony_ci nonlocal wr 15367db96d56Sopenharmony_ci c = C() 15377db96d56Sopenharmony_ci wr = weakref.ref(c) 15387db96d56Sopenharmony_ci raise_memoryerror() 15397db96d56Sopenharmony_ci # We cannot use assertRaises since it manually deletes the traceback 15407db96d56Sopenharmony_ci try: 15417db96d56Sopenharmony_ci inner() 15427db96d56Sopenharmony_ci except MemoryError as e: 15437db96d56Sopenharmony_ci self.assertNotEqual(wr(), None) 15447db96d56Sopenharmony_ci else: 15457db96d56Sopenharmony_ci self.fail("MemoryError not raised") 15467db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 15477db96d56Sopenharmony_ci self.assertEqual(wr(), None) 15487db96d56Sopenharmony_ci 15497db96d56Sopenharmony_ci @no_tracing 15507db96d56Sopenharmony_ci def test_recursion_error_cleanup(self): 15517db96d56Sopenharmony_ci # Same test as above, but with "recursion exceeded" errors 15527db96d56Sopenharmony_ci class C: 15537db96d56Sopenharmony_ci pass 15547db96d56Sopenharmony_ci wr = None 15557db96d56Sopenharmony_ci def inner(): 15567db96d56Sopenharmony_ci nonlocal wr 15577db96d56Sopenharmony_ci c = C() 15587db96d56Sopenharmony_ci wr = weakref.ref(c) 15597db96d56Sopenharmony_ci inner() 15607db96d56Sopenharmony_ci # We cannot use assertRaises since it manually deletes the traceback 15617db96d56Sopenharmony_ci try: 15627db96d56Sopenharmony_ci inner() 15637db96d56Sopenharmony_ci except RecursionError as e: 15647db96d56Sopenharmony_ci self.assertNotEqual(wr(), None) 15657db96d56Sopenharmony_ci else: 15667db96d56Sopenharmony_ci self.fail("RecursionError not raised") 15677db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 15687db96d56Sopenharmony_ci self.assertEqual(wr(), None) 15697db96d56Sopenharmony_ci 15707db96d56Sopenharmony_ci def test_errno_ENOTDIR(self): 15717db96d56Sopenharmony_ci # Issue #12802: "not a directory" errors are ENOTDIR even on Windows 15727db96d56Sopenharmony_ci with self.assertRaises(OSError) as cm: 15737db96d56Sopenharmony_ci os.listdir(__file__) 15747db96d56Sopenharmony_ci self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception) 15757db96d56Sopenharmony_ci 15767db96d56Sopenharmony_ci def test_unraisable(self): 15777db96d56Sopenharmony_ci # Issue #22836: PyErr_WriteUnraisable() should give sensible reports 15787db96d56Sopenharmony_ci class BrokenDel: 15797db96d56Sopenharmony_ci def __del__(self): 15807db96d56Sopenharmony_ci exc = ValueError("del is broken") 15817db96d56Sopenharmony_ci # The following line is included in the traceback report: 15827db96d56Sopenharmony_ci raise exc 15837db96d56Sopenharmony_ci 15847db96d56Sopenharmony_ci obj = BrokenDel() 15857db96d56Sopenharmony_ci with support.catch_unraisable_exception() as cm: 15867db96d56Sopenharmony_ci del obj 15877db96d56Sopenharmony_ci 15887db96d56Sopenharmony_ci gc_collect() # For PyPy or other GCs. 15897db96d56Sopenharmony_ci self.assertEqual(cm.unraisable.object, BrokenDel.__del__) 15907db96d56Sopenharmony_ci self.assertIsNotNone(cm.unraisable.exc_traceback) 15917db96d56Sopenharmony_ci 15927db96d56Sopenharmony_ci def test_unhandled(self): 15937db96d56Sopenharmony_ci # Check for sensible reporting of unhandled exceptions 15947db96d56Sopenharmony_ci for exc_type in (ValueError, BrokenStrException): 15957db96d56Sopenharmony_ci with self.subTest(exc_type): 15967db96d56Sopenharmony_ci try: 15977db96d56Sopenharmony_ci exc = exc_type("test message") 15987db96d56Sopenharmony_ci # The following line is included in the traceback report: 15997db96d56Sopenharmony_ci raise exc 16007db96d56Sopenharmony_ci except exc_type: 16017db96d56Sopenharmony_ci with captured_stderr() as stderr: 16027db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 16037db96d56Sopenharmony_ci report = stderr.getvalue() 16047db96d56Sopenharmony_ci self.assertIn("test_exceptions.py", report) 16057db96d56Sopenharmony_ci self.assertIn("raise exc", report) 16067db96d56Sopenharmony_ci self.assertIn(exc_type.__name__, report) 16077db96d56Sopenharmony_ci if exc_type is BrokenStrException: 16087db96d56Sopenharmony_ci self.assertIn("<exception str() failed>", report) 16097db96d56Sopenharmony_ci else: 16107db96d56Sopenharmony_ci self.assertIn("test message", report) 16117db96d56Sopenharmony_ci self.assertTrue(report.endswith("\n")) 16127db96d56Sopenharmony_ci 16137db96d56Sopenharmony_ci @cpython_only 16147db96d56Sopenharmony_ci def test_memory_error_in_PyErr_PrintEx(self): 16157db96d56Sopenharmony_ci code = """if 1: 16167db96d56Sopenharmony_ci import _testcapi 16177db96d56Sopenharmony_ci class C(): pass 16187db96d56Sopenharmony_ci _testcapi.set_nomemory(0, %d) 16197db96d56Sopenharmony_ci C() 16207db96d56Sopenharmony_ci """ 16217db96d56Sopenharmony_ci 16227db96d56Sopenharmony_ci # Issue #30817: Abort in PyErr_PrintEx() when no memory. 16237db96d56Sopenharmony_ci # Span a large range of tests as the CPython code always evolves with 16247db96d56Sopenharmony_ci # changes that add or remove memory allocations. 16257db96d56Sopenharmony_ci for i in range(1, 20): 16267db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure("-c", code % i) 16277db96d56Sopenharmony_ci self.assertIn(rc, (1, 120)) 16287db96d56Sopenharmony_ci self.assertIn(b'MemoryError', err) 16297db96d56Sopenharmony_ci 16307db96d56Sopenharmony_ci def test_yield_in_nested_try_excepts(self): 16317db96d56Sopenharmony_ci #Issue #25612 16327db96d56Sopenharmony_ci class MainError(Exception): 16337db96d56Sopenharmony_ci pass 16347db96d56Sopenharmony_ci 16357db96d56Sopenharmony_ci class SubError(Exception): 16367db96d56Sopenharmony_ci pass 16377db96d56Sopenharmony_ci 16387db96d56Sopenharmony_ci def main(): 16397db96d56Sopenharmony_ci try: 16407db96d56Sopenharmony_ci raise MainError() 16417db96d56Sopenharmony_ci except MainError: 16427db96d56Sopenharmony_ci try: 16437db96d56Sopenharmony_ci yield 16447db96d56Sopenharmony_ci except SubError: 16457db96d56Sopenharmony_ci pass 16467db96d56Sopenharmony_ci raise 16477db96d56Sopenharmony_ci 16487db96d56Sopenharmony_ci coro = main() 16497db96d56Sopenharmony_ci coro.send(None) 16507db96d56Sopenharmony_ci with self.assertRaises(MainError): 16517db96d56Sopenharmony_ci coro.throw(SubError()) 16527db96d56Sopenharmony_ci 16537db96d56Sopenharmony_ci def test_generator_doesnt_retain_old_exc2(self): 16547db96d56Sopenharmony_ci #Issue 28884#msg282532 16557db96d56Sopenharmony_ci def g(): 16567db96d56Sopenharmony_ci try: 16577db96d56Sopenharmony_ci raise ValueError 16587db96d56Sopenharmony_ci except ValueError: 16597db96d56Sopenharmony_ci yield 1 16607db96d56Sopenharmony_ci self.assertEqual(sys.exc_info(), (None, None, None)) 16617db96d56Sopenharmony_ci yield 2 16627db96d56Sopenharmony_ci 16637db96d56Sopenharmony_ci gen = g() 16647db96d56Sopenharmony_ci 16657db96d56Sopenharmony_ci try: 16667db96d56Sopenharmony_ci raise IndexError 16677db96d56Sopenharmony_ci except IndexError: 16687db96d56Sopenharmony_ci self.assertEqual(next(gen), 1) 16697db96d56Sopenharmony_ci self.assertEqual(next(gen), 2) 16707db96d56Sopenharmony_ci 16717db96d56Sopenharmony_ci def test_raise_in_generator(self): 16727db96d56Sopenharmony_ci #Issue 25612#msg304117 16737db96d56Sopenharmony_ci def g(): 16747db96d56Sopenharmony_ci yield 1 16757db96d56Sopenharmony_ci raise 16767db96d56Sopenharmony_ci yield 2 16777db96d56Sopenharmony_ci 16787db96d56Sopenharmony_ci with self.assertRaises(ZeroDivisionError): 16797db96d56Sopenharmony_ci i = g() 16807db96d56Sopenharmony_ci try: 16817db96d56Sopenharmony_ci 1/0 16827db96d56Sopenharmony_ci except: 16837db96d56Sopenharmony_ci next(i) 16847db96d56Sopenharmony_ci next(i) 16857db96d56Sopenharmony_ci 16867db96d56Sopenharmony_ci @unittest.skipUnless(__debug__, "Won't work if __debug__ is False") 16877db96d56Sopenharmony_ci def test_assert_shadowing(self): 16887db96d56Sopenharmony_ci # Shadowing AssertionError would cause the assert statement to 16897db96d56Sopenharmony_ci # misbehave. 16907db96d56Sopenharmony_ci global AssertionError 16917db96d56Sopenharmony_ci AssertionError = TypeError 16927db96d56Sopenharmony_ci try: 16937db96d56Sopenharmony_ci assert False, 'hello' 16947db96d56Sopenharmony_ci except BaseException as e: 16957db96d56Sopenharmony_ci del AssertionError 16967db96d56Sopenharmony_ci self.assertIsInstance(e, AssertionError) 16977db96d56Sopenharmony_ci self.assertEqual(str(e), 'hello') 16987db96d56Sopenharmony_ci else: 16997db96d56Sopenharmony_ci del AssertionError 17007db96d56Sopenharmony_ci self.fail('Expected exception') 17017db96d56Sopenharmony_ci 17027db96d56Sopenharmony_ci def test_memory_error_subclasses(self): 17037db96d56Sopenharmony_ci # bpo-41654: MemoryError instances use a freelist of objects that are 17047db96d56Sopenharmony_ci # linked using the 'dict' attribute when they are inactive/dead. 17057db96d56Sopenharmony_ci # Subclasses of MemoryError should not participate in the freelist 17067db96d56Sopenharmony_ci # schema. This test creates a MemoryError object and keeps it alive 17077db96d56Sopenharmony_ci # (therefore advancing the freelist) and then it creates and destroys a 17087db96d56Sopenharmony_ci # subclass object. Finally, it checks that creating a new MemoryError 17097db96d56Sopenharmony_ci # succeeds, proving that the freelist is not corrupted. 17107db96d56Sopenharmony_ci 17117db96d56Sopenharmony_ci class TestException(MemoryError): 17127db96d56Sopenharmony_ci pass 17137db96d56Sopenharmony_ci 17147db96d56Sopenharmony_ci try: 17157db96d56Sopenharmony_ci raise MemoryError 17167db96d56Sopenharmony_ci except MemoryError as exc: 17177db96d56Sopenharmony_ci inst = exc 17187db96d56Sopenharmony_ci 17197db96d56Sopenharmony_ci try: 17207db96d56Sopenharmony_ci raise TestException 17217db96d56Sopenharmony_ci except Exception: 17227db96d56Sopenharmony_ci pass 17237db96d56Sopenharmony_ci 17247db96d56Sopenharmony_ci for _ in range(10): 17257db96d56Sopenharmony_ci try: 17267db96d56Sopenharmony_ci raise MemoryError 17277db96d56Sopenharmony_ci except MemoryError as exc: 17287db96d56Sopenharmony_ci pass 17297db96d56Sopenharmony_ci 17307db96d56Sopenharmony_ci gc_collect() 17317db96d56Sopenharmony_ci 17327db96d56Sopenharmony_ciglobal_for_suggestions = None 17337db96d56Sopenharmony_ci 17347db96d56Sopenharmony_ciclass NameErrorTests(unittest.TestCase): 17357db96d56Sopenharmony_ci def test_name_error_has_name(self): 17367db96d56Sopenharmony_ci try: 17377db96d56Sopenharmony_ci bluch 17387db96d56Sopenharmony_ci except NameError as exc: 17397db96d56Sopenharmony_ci self.assertEqual("bluch", exc.name) 17407db96d56Sopenharmony_ci 17417db96d56Sopenharmony_ci def test_name_error_suggestions(self): 17427db96d56Sopenharmony_ci def Substitution(): 17437db96d56Sopenharmony_ci noise = more_noise = a = bc = None 17447db96d56Sopenharmony_ci blech = None 17457db96d56Sopenharmony_ci print(bluch) 17467db96d56Sopenharmony_ci 17477db96d56Sopenharmony_ci def Elimination(): 17487db96d56Sopenharmony_ci noise = more_noise = a = bc = None 17497db96d56Sopenharmony_ci blch = None 17507db96d56Sopenharmony_ci print(bluch) 17517db96d56Sopenharmony_ci 17527db96d56Sopenharmony_ci def Addition(): 17537db96d56Sopenharmony_ci noise = more_noise = a = bc = None 17547db96d56Sopenharmony_ci bluchin = None 17557db96d56Sopenharmony_ci print(bluch) 17567db96d56Sopenharmony_ci 17577db96d56Sopenharmony_ci def SubstitutionOverElimination(): 17587db96d56Sopenharmony_ci blach = None 17597db96d56Sopenharmony_ci bluc = None 17607db96d56Sopenharmony_ci print(bluch) 17617db96d56Sopenharmony_ci 17627db96d56Sopenharmony_ci def SubstitutionOverAddition(): 17637db96d56Sopenharmony_ci blach = None 17647db96d56Sopenharmony_ci bluchi = None 17657db96d56Sopenharmony_ci print(bluch) 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci def EliminationOverAddition(): 17687db96d56Sopenharmony_ci blucha = None 17697db96d56Sopenharmony_ci bluc = None 17707db96d56Sopenharmony_ci print(bluch) 17717db96d56Sopenharmony_ci 17727db96d56Sopenharmony_ci for func, suggestion in [(Substitution, "'blech'?"), 17737db96d56Sopenharmony_ci (Elimination, "'blch'?"), 17747db96d56Sopenharmony_ci (Addition, "'bluchin'?"), 17757db96d56Sopenharmony_ci (EliminationOverAddition, "'blucha'?"), 17767db96d56Sopenharmony_ci (SubstitutionOverElimination, "'blach'?"), 17777db96d56Sopenharmony_ci (SubstitutionOverAddition, "'blach'?")]: 17787db96d56Sopenharmony_ci err = None 17797db96d56Sopenharmony_ci try: 17807db96d56Sopenharmony_ci func() 17817db96d56Sopenharmony_ci except NameError as exc: 17827db96d56Sopenharmony_ci with support.captured_stderr() as err: 17837db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 17847db96d56Sopenharmony_ci self.assertIn(suggestion, err.getvalue()) 17857db96d56Sopenharmony_ci 17867db96d56Sopenharmony_ci def test_name_error_suggestions_from_globals(self): 17877db96d56Sopenharmony_ci def func(): 17887db96d56Sopenharmony_ci print(global_for_suggestio) 17897db96d56Sopenharmony_ci try: 17907db96d56Sopenharmony_ci func() 17917db96d56Sopenharmony_ci except NameError as exc: 17927db96d56Sopenharmony_ci with support.captured_stderr() as err: 17937db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 17947db96d56Sopenharmony_ci self.assertIn("'global_for_suggestions'?", err.getvalue()) 17957db96d56Sopenharmony_ci 17967db96d56Sopenharmony_ci def test_name_error_suggestions_from_builtins(self): 17977db96d56Sopenharmony_ci def func(): 17987db96d56Sopenharmony_ci print(ZeroDivisionErrrrr) 17997db96d56Sopenharmony_ci try: 18007db96d56Sopenharmony_ci func() 18017db96d56Sopenharmony_ci except NameError as exc: 18027db96d56Sopenharmony_ci with support.captured_stderr() as err: 18037db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18047db96d56Sopenharmony_ci self.assertIn("'ZeroDivisionError'?", err.getvalue()) 18057db96d56Sopenharmony_ci 18067db96d56Sopenharmony_ci def test_name_error_suggestions_do_not_trigger_for_long_names(self): 18077db96d56Sopenharmony_ci def f(): 18087db96d56Sopenharmony_ci somethingverywronghehehehehehe = None 18097db96d56Sopenharmony_ci print(somethingverywronghe) 18107db96d56Sopenharmony_ci 18117db96d56Sopenharmony_ci try: 18127db96d56Sopenharmony_ci f() 18137db96d56Sopenharmony_ci except NameError as exc: 18147db96d56Sopenharmony_ci with support.captured_stderr() as err: 18157db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18167db96d56Sopenharmony_ci 18177db96d56Sopenharmony_ci self.assertNotIn("somethingverywronghehe", err.getvalue()) 18187db96d56Sopenharmony_ci 18197db96d56Sopenharmony_ci def test_name_error_bad_suggestions_do_not_trigger_for_small_names(self): 18207db96d56Sopenharmony_ci vvv = mom = w = id = pytho = None 18217db96d56Sopenharmony_ci 18227db96d56Sopenharmony_ci with self.subTest(name="b"): 18237db96d56Sopenharmony_ci try: 18247db96d56Sopenharmony_ci b 18257db96d56Sopenharmony_ci except NameError as exc: 18267db96d56Sopenharmony_ci with support.captured_stderr() as err: 18277db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18287db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 18297db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 18307db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 18317db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 18327db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 18337db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 18347db96d56Sopenharmony_ci 18357db96d56Sopenharmony_ci with self.subTest(name="v"): 18367db96d56Sopenharmony_ci try: 18377db96d56Sopenharmony_ci v 18387db96d56Sopenharmony_ci except NameError as exc: 18397db96d56Sopenharmony_ci with support.captured_stderr() as err: 18407db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18417db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 18427db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 18437db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 18447db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 18457db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 18467db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 18477db96d56Sopenharmony_ci 18487db96d56Sopenharmony_ci with self.subTest(name="m"): 18497db96d56Sopenharmony_ci try: 18507db96d56Sopenharmony_ci m 18517db96d56Sopenharmony_ci except NameError as exc: 18527db96d56Sopenharmony_ci with support.captured_stderr() as err: 18537db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18547db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 18557db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 18567db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 18577db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 18587db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 18597db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 18607db96d56Sopenharmony_ci 18617db96d56Sopenharmony_ci with self.subTest(name="py"): 18627db96d56Sopenharmony_ci try: 18637db96d56Sopenharmony_ci py 18647db96d56Sopenharmony_ci except NameError as exc: 18657db96d56Sopenharmony_ci with support.captured_stderr() as err: 18667db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 18677db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 18687db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 18697db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 18707db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 18717db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 18727db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 18737db96d56Sopenharmony_ci 18747db96d56Sopenharmony_ci def test_name_error_suggestions_do_not_trigger_for_too_many_locals(self): 18757db96d56Sopenharmony_ci def f(): 18767db96d56Sopenharmony_ci # Mutating locals() is unreliable, so we need to do it by hand 18777db96d56Sopenharmony_ci a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = a10 = \ 18787db96d56Sopenharmony_ci a11 = a12 = a13 = a14 = a15 = a16 = a17 = a18 = a19 = a20 = \ 18797db96d56Sopenharmony_ci a21 = a22 = a23 = a24 = a25 = a26 = a27 = a28 = a29 = a30 = \ 18807db96d56Sopenharmony_ci a31 = a32 = a33 = a34 = a35 = a36 = a37 = a38 = a39 = a40 = \ 18817db96d56Sopenharmony_ci a41 = a42 = a43 = a44 = a45 = a46 = a47 = a48 = a49 = a50 = \ 18827db96d56Sopenharmony_ci a51 = a52 = a53 = a54 = a55 = a56 = a57 = a58 = a59 = a60 = \ 18837db96d56Sopenharmony_ci a61 = a62 = a63 = a64 = a65 = a66 = a67 = a68 = a69 = a70 = \ 18847db96d56Sopenharmony_ci a71 = a72 = a73 = a74 = a75 = a76 = a77 = a78 = a79 = a80 = \ 18857db96d56Sopenharmony_ci a81 = a82 = a83 = a84 = a85 = a86 = a87 = a88 = a89 = a90 = \ 18867db96d56Sopenharmony_ci a91 = a92 = a93 = a94 = a95 = a96 = a97 = a98 = a99 = a100 = \ 18877db96d56Sopenharmony_ci a101 = a102 = a103 = a104 = a105 = a106 = a107 = a108 = a109 = a110 = \ 18887db96d56Sopenharmony_ci a111 = a112 = a113 = a114 = a115 = a116 = a117 = a118 = a119 = a120 = \ 18897db96d56Sopenharmony_ci a121 = a122 = a123 = a124 = a125 = a126 = a127 = a128 = a129 = a130 = \ 18907db96d56Sopenharmony_ci a131 = a132 = a133 = a134 = a135 = a136 = a137 = a138 = a139 = a140 = \ 18917db96d56Sopenharmony_ci a141 = a142 = a143 = a144 = a145 = a146 = a147 = a148 = a149 = a150 = \ 18927db96d56Sopenharmony_ci a151 = a152 = a153 = a154 = a155 = a156 = a157 = a158 = a159 = a160 = \ 18937db96d56Sopenharmony_ci a161 = a162 = a163 = a164 = a165 = a166 = a167 = a168 = a169 = a170 = \ 18947db96d56Sopenharmony_ci a171 = a172 = a173 = a174 = a175 = a176 = a177 = a178 = a179 = a180 = \ 18957db96d56Sopenharmony_ci a181 = a182 = a183 = a184 = a185 = a186 = a187 = a188 = a189 = a190 = \ 18967db96d56Sopenharmony_ci a191 = a192 = a193 = a194 = a195 = a196 = a197 = a198 = a199 = a200 = \ 18977db96d56Sopenharmony_ci a201 = a202 = a203 = a204 = a205 = a206 = a207 = a208 = a209 = a210 = \ 18987db96d56Sopenharmony_ci a211 = a212 = a213 = a214 = a215 = a216 = a217 = a218 = a219 = a220 = \ 18997db96d56Sopenharmony_ci a221 = a222 = a223 = a224 = a225 = a226 = a227 = a228 = a229 = a230 = \ 19007db96d56Sopenharmony_ci a231 = a232 = a233 = a234 = a235 = a236 = a237 = a238 = a239 = a240 = \ 19017db96d56Sopenharmony_ci a241 = a242 = a243 = a244 = a245 = a246 = a247 = a248 = a249 = a250 = \ 19027db96d56Sopenharmony_ci a251 = a252 = a253 = a254 = a255 = a256 = a257 = a258 = a259 = a260 = \ 19037db96d56Sopenharmony_ci a261 = a262 = a263 = a264 = a265 = a266 = a267 = a268 = a269 = a270 = \ 19047db96d56Sopenharmony_ci a271 = a272 = a273 = a274 = a275 = a276 = a277 = a278 = a279 = a280 = \ 19057db96d56Sopenharmony_ci a281 = a282 = a283 = a284 = a285 = a286 = a287 = a288 = a289 = a290 = \ 19067db96d56Sopenharmony_ci a291 = a292 = a293 = a294 = a295 = a296 = a297 = a298 = a299 = a300 = \ 19077db96d56Sopenharmony_ci a301 = a302 = a303 = a304 = a305 = a306 = a307 = a308 = a309 = a310 = \ 19087db96d56Sopenharmony_ci a311 = a312 = a313 = a314 = a315 = a316 = a317 = a318 = a319 = a320 = \ 19097db96d56Sopenharmony_ci a321 = a322 = a323 = a324 = a325 = a326 = a327 = a328 = a329 = a330 = \ 19107db96d56Sopenharmony_ci a331 = a332 = a333 = a334 = a335 = a336 = a337 = a338 = a339 = a340 = \ 19117db96d56Sopenharmony_ci a341 = a342 = a343 = a344 = a345 = a346 = a347 = a348 = a349 = a350 = \ 19127db96d56Sopenharmony_ci a351 = a352 = a353 = a354 = a355 = a356 = a357 = a358 = a359 = a360 = \ 19137db96d56Sopenharmony_ci a361 = a362 = a363 = a364 = a365 = a366 = a367 = a368 = a369 = a370 = \ 19147db96d56Sopenharmony_ci a371 = a372 = a373 = a374 = a375 = a376 = a377 = a378 = a379 = a380 = \ 19157db96d56Sopenharmony_ci a381 = a382 = a383 = a384 = a385 = a386 = a387 = a388 = a389 = a390 = \ 19167db96d56Sopenharmony_ci a391 = a392 = a393 = a394 = a395 = a396 = a397 = a398 = a399 = a400 = \ 19177db96d56Sopenharmony_ci a401 = a402 = a403 = a404 = a405 = a406 = a407 = a408 = a409 = a410 = \ 19187db96d56Sopenharmony_ci a411 = a412 = a413 = a414 = a415 = a416 = a417 = a418 = a419 = a420 = \ 19197db96d56Sopenharmony_ci a421 = a422 = a423 = a424 = a425 = a426 = a427 = a428 = a429 = a430 = \ 19207db96d56Sopenharmony_ci a431 = a432 = a433 = a434 = a435 = a436 = a437 = a438 = a439 = a440 = \ 19217db96d56Sopenharmony_ci a441 = a442 = a443 = a444 = a445 = a446 = a447 = a448 = a449 = a450 = \ 19227db96d56Sopenharmony_ci a451 = a452 = a453 = a454 = a455 = a456 = a457 = a458 = a459 = a460 = \ 19237db96d56Sopenharmony_ci a461 = a462 = a463 = a464 = a465 = a466 = a467 = a468 = a469 = a470 = \ 19247db96d56Sopenharmony_ci a471 = a472 = a473 = a474 = a475 = a476 = a477 = a478 = a479 = a480 = \ 19257db96d56Sopenharmony_ci a481 = a482 = a483 = a484 = a485 = a486 = a487 = a488 = a489 = a490 = \ 19267db96d56Sopenharmony_ci a491 = a492 = a493 = a494 = a495 = a496 = a497 = a498 = a499 = a500 = \ 19277db96d56Sopenharmony_ci a501 = a502 = a503 = a504 = a505 = a506 = a507 = a508 = a509 = a510 = \ 19287db96d56Sopenharmony_ci a511 = a512 = a513 = a514 = a515 = a516 = a517 = a518 = a519 = a520 = \ 19297db96d56Sopenharmony_ci a521 = a522 = a523 = a524 = a525 = a526 = a527 = a528 = a529 = a530 = \ 19307db96d56Sopenharmony_ci a531 = a532 = a533 = a534 = a535 = a536 = a537 = a538 = a539 = a540 = \ 19317db96d56Sopenharmony_ci a541 = a542 = a543 = a544 = a545 = a546 = a547 = a548 = a549 = a550 = \ 19327db96d56Sopenharmony_ci a551 = a552 = a553 = a554 = a555 = a556 = a557 = a558 = a559 = a560 = \ 19337db96d56Sopenharmony_ci a561 = a562 = a563 = a564 = a565 = a566 = a567 = a568 = a569 = a570 = \ 19347db96d56Sopenharmony_ci a571 = a572 = a573 = a574 = a575 = a576 = a577 = a578 = a579 = a580 = \ 19357db96d56Sopenharmony_ci a581 = a582 = a583 = a584 = a585 = a586 = a587 = a588 = a589 = a590 = \ 19367db96d56Sopenharmony_ci a591 = a592 = a593 = a594 = a595 = a596 = a597 = a598 = a599 = a600 = \ 19377db96d56Sopenharmony_ci a601 = a602 = a603 = a604 = a605 = a606 = a607 = a608 = a609 = a610 = \ 19387db96d56Sopenharmony_ci a611 = a612 = a613 = a614 = a615 = a616 = a617 = a618 = a619 = a620 = \ 19397db96d56Sopenharmony_ci a621 = a622 = a623 = a624 = a625 = a626 = a627 = a628 = a629 = a630 = \ 19407db96d56Sopenharmony_ci a631 = a632 = a633 = a634 = a635 = a636 = a637 = a638 = a639 = a640 = \ 19417db96d56Sopenharmony_ci a641 = a642 = a643 = a644 = a645 = a646 = a647 = a648 = a649 = a650 = \ 19427db96d56Sopenharmony_ci a651 = a652 = a653 = a654 = a655 = a656 = a657 = a658 = a659 = a660 = \ 19437db96d56Sopenharmony_ci a661 = a662 = a663 = a664 = a665 = a666 = a667 = a668 = a669 = a670 = \ 19447db96d56Sopenharmony_ci a671 = a672 = a673 = a674 = a675 = a676 = a677 = a678 = a679 = a680 = \ 19457db96d56Sopenharmony_ci a681 = a682 = a683 = a684 = a685 = a686 = a687 = a688 = a689 = a690 = \ 19467db96d56Sopenharmony_ci a691 = a692 = a693 = a694 = a695 = a696 = a697 = a698 = a699 = a700 = \ 19477db96d56Sopenharmony_ci a701 = a702 = a703 = a704 = a705 = a706 = a707 = a708 = a709 = a710 = \ 19487db96d56Sopenharmony_ci a711 = a712 = a713 = a714 = a715 = a716 = a717 = a718 = a719 = a720 = \ 19497db96d56Sopenharmony_ci a721 = a722 = a723 = a724 = a725 = a726 = a727 = a728 = a729 = a730 = \ 19507db96d56Sopenharmony_ci a731 = a732 = a733 = a734 = a735 = a736 = a737 = a738 = a739 = a740 = \ 19517db96d56Sopenharmony_ci a741 = a742 = a743 = a744 = a745 = a746 = a747 = a748 = a749 = a750 = \ 19527db96d56Sopenharmony_ci a751 = a752 = a753 = a754 = a755 = a756 = a757 = a758 = a759 = a760 = \ 19537db96d56Sopenharmony_ci a761 = a762 = a763 = a764 = a765 = a766 = a767 = a768 = a769 = a770 = \ 19547db96d56Sopenharmony_ci a771 = a772 = a773 = a774 = a775 = a776 = a777 = a778 = a779 = a780 = \ 19557db96d56Sopenharmony_ci a781 = a782 = a783 = a784 = a785 = a786 = a787 = a788 = a789 = a790 = \ 19567db96d56Sopenharmony_ci a791 = a792 = a793 = a794 = a795 = a796 = a797 = a798 = a799 = a800 \ 19577db96d56Sopenharmony_ci = None 19587db96d56Sopenharmony_ci print(a0) 19597db96d56Sopenharmony_ci 19607db96d56Sopenharmony_ci try: 19617db96d56Sopenharmony_ci f() 19627db96d56Sopenharmony_ci except NameError as exc: 19637db96d56Sopenharmony_ci with support.captured_stderr() as err: 19647db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 19657db96d56Sopenharmony_ci 19667db96d56Sopenharmony_ci self.assertNotRegex(err.getvalue(), r"NameError.*a1") 19677db96d56Sopenharmony_ci 19687db96d56Sopenharmony_ci def test_name_error_with_custom_exceptions(self): 19697db96d56Sopenharmony_ci def f(): 19707db96d56Sopenharmony_ci blech = None 19717db96d56Sopenharmony_ci raise NameError() 19727db96d56Sopenharmony_ci 19737db96d56Sopenharmony_ci try: 19747db96d56Sopenharmony_ci f() 19757db96d56Sopenharmony_ci except NameError as exc: 19767db96d56Sopenharmony_ci with support.captured_stderr() as err: 19777db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 19787db96d56Sopenharmony_ci 19797db96d56Sopenharmony_ci self.assertNotIn("blech", err.getvalue()) 19807db96d56Sopenharmony_ci 19817db96d56Sopenharmony_ci def f(): 19827db96d56Sopenharmony_ci blech = None 19837db96d56Sopenharmony_ci raise NameError 19847db96d56Sopenharmony_ci 19857db96d56Sopenharmony_ci try: 19867db96d56Sopenharmony_ci f() 19877db96d56Sopenharmony_ci except NameError as exc: 19887db96d56Sopenharmony_ci with support.captured_stderr() as err: 19897db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 19907db96d56Sopenharmony_ci 19917db96d56Sopenharmony_ci self.assertNotIn("blech", err.getvalue()) 19927db96d56Sopenharmony_ci 19937db96d56Sopenharmony_ci def test_unbound_local_error_doesn_not_match(self): 19947db96d56Sopenharmony_ci def foo(): 19957db96d56Sopenharmony_ci something = 3 19967db96d56Sopenharmony_ci print(somethong) 19977db96d56Sopenharmony_ci somethong = 3 19987db96d56Sopenharmony_ci 19997db96d56Sopenharmony_ci try: 20007db96d56Sopenharmony_ci foo() 20017db96d56Sopenharmony_ci except UnboundLocalError as exc: 20027db96d56Sopenharmony_ci with support.captured_stderr() as err: 20037db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 20047db96d56Sopenharmony_ci 20057db96d56Sopenharmony_ci self.assertNotIn("something", err.getvalue()) 20067db96d56Sopenharmony_ci 20077db96d56Sopenharmony_ci def test_issue45826(self): 20087db96d56Sopenharmony_ci # regression test for bpo-45826 20097db96d56Sopenharmony_ci def f(): 20107db96d56Sopenharmony_ci with self.assertRaisesRegex(NameError, 'aaa'): 20117db96d56Sopenharmony_ci aab 20127db96d56Sopenharmony_ci 20137db96d56Sopenharmony_ci try: 20147db96d56Sopenharmony_ci f() 20157db96d56Sopenharmony_ci except self.failureException: 20167db96d56Sopenharmony_ci with support.captured_stderr() as err: 20177db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 20187db96d56Sopenharmony_ci 20197db96d56Sopenharmony_ci self.assertIn("aab", err.getvalue()) 20207db96d56Sopenharmony_ci 20217db96d56Sopenharmony_ci def test_issue45826_focused(self): 20227db96d56Sopenharmony_ci def f(): 20237db96d56Sopenharmony_ci try: 20247db96d56Sopenharmony_ci nonsense 20257db96d56Sopenharmony_ci except BaseException as E: 20267db96d56Sopenharmony_ci E.with_traceback(None) 20277db96d56Sopenharmony_ci raise ZeroDivisionError() 20287db96d56Sopenharmony_ci 20297db96d56Sopenharmony_ci try: 20307db96d56Sopenharmony_ci f() 20317db96d56Sopenharmony_ci except ZeroDivisionError: 20327db96d56Sopenharmony_ci with support.captured_stderr() as err: 20337db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 20347db96d56Sopenharmony_ci 20357db96d56Sopenharmony_ci self.assertIn("nonsense", err.getvalue()) 20367db96d56Sopenharmony_ci self.assertIn("ZeroDivisionError", err.getvalue()) 20377db96d56Sopenharmony_ci 20387db96d56Sopenharmony_ci 20397db96d56Sopenharmony_ciclass AttributeErrorTests(unittest.TestCase): 20407db96d56Sopenharmony_ci def test_attributes(self): 20417db96d56Sopenharmony_ci # Setting 'attr' should not be a problem. 20427db96d56Sopenharmony_ci exc = AttributeError('Ouch!') 20437db96d56Sopenharmony_ci self.assertIsNone(exc.name) 20447db96d56Sopenharmony_ci self.assertIsNone(exc.obj) 20457db96d56Sopenharmony_ci 20467db96d56Sopenharmony_ci sentinel = object() 20477db96d56Sopenharmony_ci exc = AttributeError('Ouch', name='carry', obj=sentinel) 20487db96d56Sopenharmony_ci self.assertEqual(exc.name, 'carry') 20497db96d56Sopenharmony_ci self.assertIs(exc.obj, sentinel) 20507db96d56Sopenharmony_ci 20517db96d56Sopenharmony_ci def test_getattr_has_name_and_obj(self): 20527db96d56Sopenharmony_ci class A: 20537db96d56Sopenharmony_ci blech = None 20547db96d56Sopenharmony_ci 20557db96d56Sopenharmony_ci obj = A() 20567db96d56Sopenharmony_ci try: 20577db96d56Sopenharmony_ci obj.bluch 20587db96d56Sopenharmony_ci except AttributeError as exc: 20597db96d56Sopenharmony_ci self.assertEqual("bluch", exc.name) 20607db96d56Sopenharmony_ci self.assertEqual(obj, exc.obj) 20617db96d56Sopenharmony_ci try: 20627db96d56Sopenharmony_ci object.__getattribute__(obj, "bluch") 20637db96d56Sopenharmony_ci except AttributeError as exc: 20647db96d56Sopenharmony_ci self.assertEqual("bluch", exc.name) 20657db96d56Sopenharmony_ci self.assertEqual(obj, exc.obj) 20667db96d56Sopenharmony_ci 20677db96d56Sopenharmony_ci def test_getattr_has_name_and_obj_for_method(self): 20687db96d56Sopenharmony_ci class A: 20697db96d56Sopenharmony_ci def blech(self): 20707db96d56Sopenharmony_ci return 20717db96d56Sopenharmony_ci 20727db96d56Sopenharmony_ci obj = A() 20737db96d56Sopenharmony_ci try: 20747db96d56Sopenharmony_ci obj.bluch() 20757db96d56Sopenharmony_ci except AttributeError as exc: 20767db96d56Sopenharmony_ci self.assertEqual("bluch", exc.name) 20777db96d56Sopenharmony_ci self.assertEqual(obj, exc.obj) 20787db96d56Sopenharmony_ci 20797db96d56Sopenharmony_ci def test_getattr_suggestions(self): 20807db96d56Sopenharmony_ci class Substitution: 20817db96d56Sopenharmony_ci noise = more_noise = a = bc = None 20827db96d56Sopenharmony_ci blech = None 20837db96d56Sopenharmony_ci 20847db96d56Sopenharmony_ci class Elimination: 20857db96d56Sopenharmony_ci noise = more_noise = a = bc = None 20867db96d56Sopenharmony_ci blch = None 20877db96d56Sopenharmony_ci 20887db96d56Sopenharmony_ci class Addition: 20897db96d56Sopenharmony_ci noise = more_noise = a = bc = None 20907db96d56Sopenharmony_ci bluchin = None 20917db96d56Sopenharmony_ci 20927db96d56Sopenharmony_ci class SubstitutionOverElimination: 20937db96d56Sopenharmony_ci blach = None 20947db96d56Sopenharmony_ci bluc = None 20957db96d56Sopenharmony_ci 20967db96d56Sopenharmony_ci class SubstitutionOverAddition: 20977db96d56Sopenharmony_ci blach = None 20987db96d56Sopenharmony_ci bluchi = None 20997db96d56Sopenharmony_ci 21007db96d56Sopenharmony_ci class EliminationOverAddition: 21017db96d56Sopenharmony_ci blucha = None 21027db96d56Sopenharmony_ci bluc = None 21037db96d56Sopenharmony_ci 21047db96d56Sopenharmony_ci for cls, suggestion in [(Substitution, "'blech'?"), 21057db96d56Sopenharmony_ci (Elimination, "'blch'?"), 21067db96d56Sopenharmony_ci (Addition, "'bluchin'?"), 21077db96d56Sopenharmony_ci (EliminationOverAddition, "'bluc'?"), 21087db96d56Sopenharmony_ci (SubstitutionOverElimination, "'blach'?"), 21097db96d56Sopenharmony_ci (SubstitutionOverAddition, "'blach'?")]: 21107db96d56Sopenharmony_ci try: 21117db96d56Sopenharmony_ci cls().bluch 21127db96d56Sopenharmony_ci except AttributeError as exc: 21137db96d56Sopenharmony_ci with support.captured_stderr() as err: 21147db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21157db96d56Sopenharmony_ci 21167db96d56Sopenharmony_ci self.assertIn(suggestion, err.getvalue()) 21177db96d56Sopenharmony_ci 21187db96d56Sopenharmony_ci def test_getattr_suggestions_do_not_trigger_for_long_attributes(self): 21197db96d56Sopenharmony_ci class A: 21207db96d56Sopenharmony_ci blech = None 21217db96d56Sopenharmony_ci 21227db96d56Sopenharmony_ci try: 21237db96d56Sopenharmony_ci A().somethingverywrong 21247db96d56Sopenharmony_ci except AttributeError as exc: 21257db96d56Sopenharmony_ci with support.captured_stderr() as err: 21267db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21277db96d56Sopenharmony_ci 21287db96d56Sopenharmony_ci self.assertNotIn("blech", err.getvalue()) 21297db96d56Sopenharmony_ci 21307db96d56Sopenharmony_ci def test_getattr_error_bad_suggestions_do_not_trigger_for_small_names(self): 21317db96d56Sopenharmony_ci class MyClass: 21327db96d56Sopenharmony_ci vvv = mom = w = id = pytho = None 21337db96d56Sopenharmony_ci 21347db96d56Sopenharmony_ci with self.subTest(name="b"): 21357db96d56Sopenharmony_ci try: 21367db96d56Sopenharmony_ci MyClass.b 21377db96d56Sopenharmony_ci except AttributeError as exc: 21387db96d56Sopenharmony_ci with support.captured_stderr() as err: 21397db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21407db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 21417db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 21427db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 21437db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 21447db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 21457db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 21467db96d56Sopenharmony_ci 21477db96d56Sopenharmony_ci with self.subTest(name="v"): 21487db96d56Sopenharmony_ci try: 21497db96d56Sopenharmony_ci MyClass.v 21507db96d56Sopenharmony_ci except AttributeError as exc: 21517db96d56Sopenharmony_ci with support.captured_stderr() as err: 21527db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21537db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 21547db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 21557db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 21567db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 21577db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 21587db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 21597db96d56Sopenharmony_ci 21607db96d56Sopenharmony_ci with self.subTest(name="m"): 21617db96d56Sopenharmony_ci try: 21627db96d56Sopenharmony_ci MyClass.m 21637db96d56Sopenharmony_ci except AttributeError as exc: 21647db96d56Sopenharmony_ci with support.captured_stderr() as err: 21657db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21667db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 21677db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 21687db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 21697db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 21707db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 21717db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 21727db96d56Sopenharmony_ci 21737db96d56Sopenharmony_ci with self.subTest(name="py"): 21747db96d56Sopenharmony_ci try: 21757db96d56Sopenharmony_ci MyClass.py 21767db96d56Sopenharmony_ci except AttributeError as exc: 21777db96d56Sopenharmony_ci with support.captured_stderr() as err: 21787db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 21797db96d56Sopenharmony_ci self.assertNotIn("you mean", err.getvalue()) 21807db96d56Sopenharmony_ci self.assertNotIn("vvv", err.getvalue()) 21817db96d56Sopenharmony_ci self.assertNotIn("mom", err.getvalue()) 21827db96d56Sopenharmony_ci self.assertNotIn("'id'", err.getvalue()) 21837db96d56Sopenharmony_ci self.assertNotIn("'w'", err.getvalue()) 21847db96d56Sopenharmony_ci self.assertNotIn("'pytho'", err.getvalue()) 21857db96d56Sopenharmony_ci 21867db96d56Sopenharmony_ci 21877db96d56Sopenharmony_ci def test_getattr_suggestions_do_not_trigger_for_big_dicts(self): 21887db96d56Sopenharmony_ci class A: 21897db96d56Sopenharmony_ci blech = None 21907db96d56Sopenharmony_ci # A class with a very big __dict__ will not be consider 21917db96d56Sopenharmony_ci # for suggestions. 21927db96d56Sopenharmony_ci for index in range(2000): 21937db96d56Sopenharmony_ci setattr(A, f"index_{index}", None) 21947db96d56Sopenharmony_ci 21957db96d56Sopenharmony_ci try: 21967db96d56Sopenharmony_ci A().bluch 21977db96d56Sopenharmony_ci except AttributeError as exc: 21987db96d56Sopenharmony_ci with support.captured_stderr() as err: 21997db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22007db96d56Sopenharmony_ci 22017db96d56Sopenharmony_ci self.assertNotIn("blech", err.getvalue()) 22027db96d56Sopenharmony_ci 22037db96d56Sopenharmony_ci def test_getattr_suggestions_no_args(self): 22047db96d56Sopenharmony_ci class A: 22057db96d56Sopenharmony_ci blech = None 22067db96d56Sopenharmony_ci def __getattr__(self, attr): 22077db96d56Sopenharmony_ci raise AttributeError() 22087db96d56Sopenharmony_ci 22097db96d56Sopenharmony_ci try: 22107db96d56Sopenharmony_ci A().bluch 22117db96d56Sopenharmony_ci except AttributeError as exc: 22127db96d56Sopenharmony_ci with support.captured_stderr() as err: 22137db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22147db96d56Sopenharmony_ci 22157db96d56Sopenharmony_ci self.assertIn("blech", err.getvalue()) 22167db96d56Sopenharmony_ci 22177db96d56Sopenharmony_ci class A: 22187db96d56Sopenharmony_ci blech = None 22197db96d56Sopenharmony_ci def __getattr__(self, attr): 22207db96d56Sopenharmony_ci raise AttributeError 22217db96d56Sopenharmony_ci 22227db96d56Sopenharmony_ci try: 22237db96d56Sopenharmony_ci A().bluch 22247db96d56Sopenharmony_ci except AttributeError as exc: 22257db96d56Sopenharmony_ci with support.captured_stderr() as err: 22267db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22277db96d56Sopenharmony_ci 22287db96d56Sopenharmony_ci self.assertIn("blech", err.getvalue()) 22297db96d56Sopenharmony_ci 22307db96d56Sopenharmony_ci def test_getattr_suggestions_invalid_args(self): 22317db96d56Sopenharmony_ci class NonStringifyClass: 22327db96d56Sopenharmony_ci __str__ = None 22337db96d56Sopenharmony_ci __repr__ = None 22347db96d56Sopenharmony_ci 22357db96d56Sopenharmony_ci class A: 22367db96d56Sopenharmony_ci blech = None 22377db96d56Sopenharmony_ci def __getattr__(self, attr): 22387db96d56Sopenharmony_ci raise AttributeError(NonStringifyClass()) 22397db96d56Sopenharmony_ci 22407db96d56Sopenharmony_ci class B: 22417db96d56Sopenharmony_ci blech = None 22427db96d56Sopenharmony_ci def __getattr__(self, attr): 22437db96d56Sopenharmony_ci raise AttributeError("Error", 23) 22447db96d56Sopenharmony_ci 22457db96d56Sopenharmony_ci class C: 22467db96d56Sopenharmony_ci blech = None 22477db96d56Sopenharmony_ci def __getattr__(self, attr): 22487db96d56Sopenharmony_ci raise AttributeError(23) 22497db96d56Sopenharmony_ci 22507db96d56Sopenharmony_ci for cls in [A, B, C]: 22517db96d56Sopenharmony_ci try: 22527db96d56Sopenharmony_ci cls().bluch 22537db96d56Sopenharmony_ci except AttributeError as exc: 22547db96d56Sopenharmony_ci with support.captured_stderr() as err: 22557db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22567db96d56Sopenharmony_ci 22577db96d56Sopenharmony_ci self.assertIn("blech", err.getvalue()) 22587db96d56Sopenharmony_ci 22597db96d56Sopenharmony_ci def test_getattr_suggestions_for_same_name(self): 22607db96d56Sopenharmony_ci class A: 22617db96d56Sopenharmony_ci def __dir__(self): 22627db96d56Sopenharmony_ci return ['blech'] 22637db96d56Sopenharmony_ci try: 22647db96d56Sopenharmony_ci A().blech 22657db96d56Sopenharmony_ci except AttributeError as exc: 22667db96d56Sopenharmony_ci with support.captured_stderr() as err: 22677db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22687db96d56Sopenharmony_ci 22697db96d56Sopenharmony_ci self.assertNotIn("Did you mean", err.getvalue()) 22707db96d56Sopenharmony_ci 22717db96d56Sopenharmony_ci def test_attribute_error_with_failing_dict(self): 22727db96d56Sopenharmony_ci class T: 22737db96d56Sopenharmony_ci bluch = 1 22747db96d56Sopenharmony_ci def __dir__(self): 22757db96d56Sopenharmony_ci raise AttributeError("oh no!") 22767db96d56Sopenharmony_ci 22777db96d56Sopenharmony_ci try: 22787db96d56Sopenharmony_ci T().blich 22797db96d56Sopenharmony_ci except AttributeError as exc: 22807db96d56Sopenharmony_ci with support.captured_stderr() as err: 22817db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22827db96d56Sopenharmony_ci 22837db96d56Sopenharmony_ci self.assertNotIn("blech", err.getvalue()) 22847db96d56Sopenharmony_ci self.assertNotIn("oh no!", err.getvalue()) 22857db96d56Sopenharmony_ci 22867db96d56Sopenharmony_ci def test_attribute_error_with_bad_name(self): 22877db96d56Sopenharmony_ci try: 22887db96d56Sopenharmony_ci raise AttributeError(name=12, obj=23) 22897db96d56Sopenharmony_ci except AttributeError as exc: 22907db96d56Sopenharmony_ci with support.captured_stderr() as err: 22917db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 22927db96d56Sopenharmony_ci 22937db96d56Sopenharmony_ci self.assertNotIn("?", err.getvalue()) 22947db96d56Sopenharmony_ci 22957db96d56Sopenharmony_ci def test_attribute_error_inside_nested_getattr(self): 22967db96d56Sopenharmony_ci class A: 22977db96d56Sopenharmony_ci bluch = 1 22987db96d56Sopenharmony_ci 22997db96d56Sopenharmony_ci class B: 23007db96d56Sopenharmony_ci def __getattribute__(self, attr): 23017db96d56Sopenharmony_ci a = A() 23027db96d56Sopenharmony_ci return a.blich 23037db96d56Sopenharmony_ci 23047db96d56Sopenharmony_ci try: 23057db96d56Sopenharmony_ci B().something 23067db96d56Sopenharmony_ci except AttributeError as exc: 23077db96d56Sopenharmony_ci with support.captured_stderr() as err: 23087db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 23097db96d56Sopenharmony_ci 23107db96d56Sopenharmony_ci self.assertIn("Did you mean", err.getvalue()) 23117db96d56Sopenharmony_ci self.assertIn("bluch", err.getvalue()) 23127db96d56Sopenharmony_ci 23137db96d56Sopenharmony_ci 23147db96d56Sopenharmony_ciclass ImportErrorTests(unittest.TestCase): 23157db96d56Sopenharmony_ci 23167db96d56Sopenharmony_ci def test_attributes(self): 23177db96d56Sopenharmony_ci # Setting 'name' and 'path' should not be a problem. 23187db96d56Sopenharmony_ci exc = ImportError('test') 23197db96d56Sopenharmony_ci self.assertIsNone(exc.name) 23207db96d56Sopenharmony_ci self.assertIsNone(exc.path) 23217db96d56Sopenharmony_ci 23227db96d56Sopenharmony_ci exc = ImportError('test', name='somemodule') 23237db96d56Sopenharmony_ci self.assertEqual(exc.name, 'somemodule') 23247db96d56Sopenharmony_ci self.assertIsNone(exc.path) 23257db96d56Sopenharmony_ci 23267db96d56Sopenharmony_ci exc = ImportError('test', path='somepath') 23277db96d56Sopenharmony_ci self.assertEqual(exc.path, 'somepath') 23287db96d56Sopenharmony_ci self.assertIsNone(exc.name) 23297db96d56Sopenharmony_ci 23307db96d56Sopenharmony_ci exc = ImportError('test', path='somepath', name='somename') 23317db96d56Sopenharmony_ci self.assertEqual(exc.name, 'somename') 23327db96d56Sopenharmony_ci self.assertEqual(exc.path, 'somepath') 23337db96d56Sopenharmony_ci 23347db96d56Sopenharmony_ci msg = "'invalid' is an invalid keyword argument for ImportError" 23357db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 23367db96d56Sopenharmony_ci ImportError('test', invalid='keyword') 23377db96d56Sopenharmony_ci 23387db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 23397db96d56Sopenharmony_ci ImportError('test', name='name', invalid='keyword') 23407db96d56Sopenharmony_ci 23417db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 23427db96d56Sopenharmony_ci ImportError('test', path='path', invalid='keyword') 23437db96d56Sopenharmony_ci 23447db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 23457db96d56Sopenharmony_ci ImportError(invalid='keyword') 23467db96d56Sopenharmony_ci 23477db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, msg): 23487db96d56Sopenharmony_ci ImportError('test', invalid='keyword', another=True) 23497db96d56Sopenharmony_ci 23507db96d56Sopenharmony_ci def test_reset_attributes(self): 23517db96d56Sopenharmony_ci exc = ImportError('test', name='name', path='path') 23527db96d56Sopenharmony_ci self.assertEqual(exc.args, ('test',)) 23537db96d56Sopenharmony_ci self.assertEqual(exc.msg, 'test') 23547db96d56Sopenharmony_ci self.assertEqual(exc.name, 'name') 23557db96d56Sopenharmony_ci self.assertEqual(exc.path, 'path') 23567db96d56Sopenharmony_ci 23577db96d56Sopenharmony_ci # Reset not specified attributes 23587db96d56Sopenharmony_ci exc.__init__() 23597db96d56Sopenharmony_ci self.assertEqual(exc.args, ()) 23607db96d56Sopenharmony_ci self.assertEqual(exc.msg, None) 23617db96d56Sopenharmony_ci self.assertEqual(exc.name, None) 23627db96d56Sopenharmony_ci self.assertEqual(exc.path, None) 23637db96d56Sopenharmony_ci 23647db96d56Sopenharmony_ci def test_non_str_argument(self): 23657db96d56Sopenharmony_ci # Issue #15778 23667db96d56Sopenharmony_ci with check_warnings(('', BytesWarning), quiet=True): 23677db96d56Sopenharmony_ci arg = b'abc' 23687db96d56Sopenharmony_ci exc = ImportError(arg) 23697db96d56Sopenharmony_ci self.assertEqual(str(arg), str(exc)) 23707db96d56Sopenharmony_ci 23717db96d56Sopenharmony_ci def test_copy_pickle(self): 23727db96d56Sopenharmony_ci for kwargs in (dict(), 23737db96d56Sopenharmony_ci dict(name='somename'), 23747db96d56Sopenharmony_ci dict(path='somepath'), 23757db96d56Sopenharmony_ci dict(name='somename', path='somepath')): 23767db96d56Sopenharmony_ci orig = ImportError('test', **kwargs) 23777db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 23787db96d56Sopenharmony_ci exc = pickle.loads(pickle.dumps(orig, proto)) 23797db96d56Sopenharmony_ci self.assertEqual(exc.args, ('test',)) 23807db96d56Sopenharmony_ci self.assertEqual(exc.msg, 'test') 23817db96d56Sopenharmony_ci self.assertEqual(exc.name, orig.name) 23827db96d56Sopenharmony_ci self.assertEqual(exc.path, orig.path) 23837db96d56Sopenharmony_ci for c in copy.copy, copy.deepcopy: 23847db96d56Sopenharmony_ci exc = c(orig) 23857db96d56Sopenharmony_ci self.assertEqual(exc.args, ('test',)) 23867db96d56Sopenharmony_ci self.assertEqual(exc.msg, 'test') 23877db96d56Sopenharmony_ci self.assertEqual(exc.name, orig.name) 23887db96d56Sopenharmony_ci self.assertEqual(exc.path, orig.path) 23897db96d56Sopenharmony_ci 23907db96d56Sopenharmony_ciclass SyntaxErrorTests(unittest.TestCase): 23917db96d56Sopenharmony_ci def test_range_of_offsets(self): 23927db96d56Sopenharmony_ci cases = [ 23937db96d56Sopenharmony_ci # Basic range from 2->7 23947db96d56Sopenharmony_ci (("bad.py", 1, 2, "abcdefg", 1, 7), 23957db96d56Sopenharmony_ci dedent( 23967db96d56Sopenharmony_ci """ 23977db96d56Sopenharmony_ci File "bad.py", line 1 23987db96d56Sopenharmony_ci abcdefg 23997db96d56Sopenharmony_ci ^^^^^ 24007db96d56Sopenharmony_ci SyntaxError: bad bad 24017db96d56Sopenharmony_ci """)), 24027db96d56Sopenharmony_ci # end_offset = start_offset + 1 24037db96d56Sopenharmony_ci (("bad.py", 1, 2, "abcdefg", 1, 3), 24047db96d56Sopenharmony_ci dedent( 24057db96d56Sopenharmony_ci """ 24067db96d56Sopenharmony_ci File "bad.py", line 1 24077db96d56Sopenharmony_ci abcdefg 24087db96d56Sopenharmony_ci ^ 24097db96d56Sopenharmony_ci SyntaxError: bad bad 24107db96d56Sopenharmony_ci """)), 24117db96d56Sopenharmony_ci # Negative end offset 24127db96d56Sopenharmony_ci (("bad.py", 1, 2, "abcdefg", 1, -2), 24137db96d56Sopenharmony_ci dedent( 24147db96d56Sopenharmony_ci """ 24157db96d56Sopenharmony_ci File "bad.py", line 1 24167db96d56Sopenharmony_ci abcdefg 24177db96d56Sopenharmony_ci ^ 24187db96d56Sopenharmony_ci SyntaxError: bad bad 24197db96d56Sopenharmony_ci """)), 24207db96d56Sopenharmony_ci # end offset before starting offset 24217db96d56Sopenharmony_ci (("bad.py", 1, 4, "abcdefg", 1, 2), 24227db96d56Sopenharmony_ci dedent( 24237db96d56Sopenharmony_ci """ 24247db96d56Sopenharmony_ci File "bad.py", line 1 24257db96d56Sopenharmony_ci abcdefg 24267db96d56Sopenharmony_ci ^ 24277db96d56Sopenharmony_ci SyntaxError: bad bad 24287db96d56Sopenharmony_ci """)), 24297db96d56Sopenharmony_ci # Both offsets negative 24307db96d56Sopenharmony_ci (("bad.py", 1, -4, "abcdefg", 1, -2), 24317db96d56Sopenharmony_ci dedent( 24327db96d56Sopenharmony_ci """ 24337db96d56Sopenharmony_ci File "bad.py", line 1 24347db96d56Sopenharmony_ci abcdefg 24357db96d56Sopenharmony_ci SyntaxError: bad bad 24367db96d56Sopenharmony_ci """)), 24377db96d56Sopenharmony_ci # Both offsets negative and the end more negative 24387db96d56Sopenharmony_ci (("bad.py", 1, -4, "abcdefg", 1, -5), 24397db96d56Sopenharmony_ci dedent( 24407db96d56Sopenharmony_ci """ 24417db96d56Sopenharmony_ci File "bad.py", line 1 24427db96d56Sopenharmony_ci abcdefg 24437db96d56Sopenharmony_ci SyntaxError: bad bad 24447db96d56Sopenharmony_ci """)), 24457db96d56Sopenharmony_ci # Both offsets 0 24467db96d56Sopenharmony_ci (("bad.py", 1, 0, "abcdefg", 1, 0), 24477db96d56Sopenharmony_ci dedent( 24487db96d56Sopenharmony_ci """ 24497db96d56Sopenharmony_ci File "bad.py", line 1 24507db96d56Sopenharmony_ci abcdefg 24517db96d56Sopenharmony_ci SyntaxError: bad bad 24527db96d56Sopenharmony_ci """)), 24537db96d56Sopenharmony_ci # Start offset 0 and end offset not 0 24547db96d56Sopenharmony_ci (("bad.py", 1, 0, "abcdefg", 1, 5), 24557db96d56Sopenharmony_ci dedent( 24567db96d56Sopenharmony_ci """ 24577db96d56Sopenharmony_ci File "bad.py", line 1 24587db96d56Sopenharmony_ci abcdefg 24597db96d56Sopenharmony_ci SyntaxError: bad bad 24607db96d56Sopenharmony_ci """)), 24617db96d56Sopenharmony_ci # End offset pass the source length 24627db96d56Sopenharmony_ci (("bad.py", 1, 2, "abcdefg", 1, 100), 24637db96d56Sopenharmony_ci dedent( 24647db96d56Sopenharmony_ci """ 24657db96d56Sopenharmony_ci File "bad.py", line 1 24667db96d56Sopenharmony_ci abcdefg 24677db96d56Sopenharmony_ci ^^^^^^ 24687db96d56Sopenharmony_ci SyntaxError: bad bad 24697db96d56Sopenharmony_ci """)), 24707db96d56Sopenharmony_ci ] 24717db96d56Sopenharmony_ci for args, expected in cases: 24727db96d56Sopenharmony_ci with self.subTest(args=args): 24737db96d56Sopenharmony_ci try: 24747db96d56Sopenharmony_ci raise SyntaxError("bad bad", args) 24757db96d56Sopenharmony_ci except SyntaxError as exc: 24767db96d56Sopenharmony_ci with support.captured_stderr() as err: 24777db96d56Sopenharmony_ci sys.__excepthook__(*sys.exc_info()) 24787db96d56Sopenharmony_ci self.assertIn(expected, err.getvalue()) 24797db96d56Sopenharmony_ci the_exception = exc 24807db96d56Sopenharmony_ci 24817db96d56Sopenharmony_ci def test_encodings(self): 24827db96d56Sopenharmony_ci source = ( 24837db96d56Sopenharmony_ci '# -*- coding: cp437 -*-\n' 24847db96d56Sopenharmony_ci '"┬ó┬ó┬ó┬ó┬ó┬ó" + f(4, x for x in range(1))\n' 24857db96d56Sopenharmony_ci ) 24867db96d56Sopenharmony_ci try: 24877db96d56Sopenharmony_ci with open(TESTFN, 'w', encoding='cp437') as testfile: 24887db96d56Sopenharmony_ci testfile.write(source) 24897db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) 24907db96d56Sopenharmony_ci err = err.decode('utf-8').splitlines() 24917db96d56Sopenharmony_ci 24927db96d56Sopenharmony_ci self.assertEqual(err[-3], ' "┬ó┬ó┬ó┬ó┬ó┬ó" + f(4, x for x in range(1))') 24937db96d56Sopenharmony_ci self.assertEqual(err[-2], ' ^^^^^^^^^^^^^^^^^^^') 24947db96d56Sopenharmony_ci finally: 24957db96d56Sopenharmony_ci unlink(TESTFN) 24967db96d56Sopenharmony_ci 24977db96d56Sopenharmony_ci # Check backwards tokenizer errors 24987db96d56Sopenharmony_ci source = '# -*- coding: ascii -*-\n\n(\n' 24997db96d56Sopenharmony_ci try: 25007db96d56Sopenharmony_ci with open(TESTFN, 'w', encoding='ascii') as testfile: 25017db96d56Sopenharmony_ci testfile.write(source) 25027db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) 25037db96d56Sopenharmony_ci err = err.decode('utf-8').splitlines() 25047db96d56Sopenharmony_ci 25057db96d56Sopenharmony_ci self.assertEqual(err[-3], ' (') 25067db96d56Sopenharmony_ci self.assertEqual(err[-2], ' ^') 25077db96d56Sopenharmony_ci finally: 25087db96d56Sopenharmony_ci unlink(TESTFN) 25097db96d56Sopenharmony_ci 25107db96d56Sopenharmony_ci def test_non_utf8(self): 25117db96d56Sopenharmony_ci # Check non utf-8 characters 25127db96d56Sopenharmony_ci try: 25137db96d56Sopenharmony_ci with open(TESTFN, 'bw') as testfile: 25147db96d56Sopenharmony_ci testfile.write(b"\x89") 25157db96d56Sopenharmony_ci rc, out, err = script_helper.assert_python_failure('-Wd', '-X', 'utf8', TESTFN) 25167db96d56Sopenharmony_ci err = err.decode('utf-8').splitlines() 25177db96d56Sopenharmony_ci 25187db96d56Sopenharmony_ci self.assertIn("SyntaxError: Non-UTF-8 code starting with '\\x89' in file", err[-1]) 25197db96d56Sopenharmony_ci finally: 25207db96d56Sopenharmony_ci unlink(TESTFN) 25217db96d56Sopenharmony_ci 25227db96d56Sopenharmony_ci def test_attributes_new_constructor(self): 25237db96d56Sopenharmony_ci args = ("bad.py", 1, 2, "abcdefg", 1, 100) 25247db96d56Sopenharmony_ci the_exception = SyntaxError("bad bad", args) 25257db96d56Sopenharmony_ci filename, lineno, offset, error, end_lineno, end_offset = args 25267db96d56Sopenharmony_ci self.assertEqual(filename, the_exception.filename) 25277db96d56Sopenharmony_ci self.assertEqual(lineno, the_exception.lineno) 25287db96d56Sopenharmony_ci self.assertEqual(end_lineno, the_exception.end_lineno) 25297db96d56Sopenharmony_ci self.assertEqual(offset, the_exception.offset) 25307db96d56Sopenharmony_ci self.assertEqual(end_offset, the_exception.end_offset) 25317db96d56Sopenharmony_ci self.assertEqual(error, the_exception.text) 25327db96d56Sopenharmony_ci self.assertEqual("bad bad", the_exception.msg) 25337db96d56Sopenharmony_ci 25347db96d56Sopenharmony_ci def test_attributes_old_constructor(self): 25357db96d56Sopenharmony_ci args = ("bad.py", 1, 2, "abcdefg") 25367db96d56Sopenharmony_ci the_exception = SyntaxError("bad bad", args) 25377db96d56Sopenharmony_ci filename, lineno, offset, error = args 25387db96d56Sopenharmony_ci self.assertEqual(filename, the_exception.filename) 25397db96d56Sopenharmony_ci self.assertEqual(lineno, the_exception.lineno) 25407db96d56Sopenharmony_ci self.assertEqual(None, the_exception.end_lineno) 25417db96d56Sopenharmony_ci self.assertEqual(offset, the_exception.offset) 25427db96d56Sopenharmony_ci self.assertEqual(None, the_exception.end_offset) 25437db96d56Sopenharmony_ci self.assertEqual(error, the_exception.text) 25447db96d56Sopenharmony_ci self.assertEqual("bad bad", the_exception.msg) 25457db96d56Sopenharmony_ci 25467db96d56Sopenharmony_ci def test_incorrect_constructor(self): 25477db96d56Sopenharmony_ci args = ("bad.py", 1, 2) 25487db96d56Sopenharmony_ci self.assertRaises(TypeError, SyntaxError, "bad bad", args) 25497db96d56Sopenharmony_ci 25507db96d56Sopenharmony_ci args = ("bad.py", 1, 2, 4, 5, 6, 7) 25517db96d56Sopenharmony_ci self.assertRaises(TypeError, SyntaxError, "bad bad", args) 25527db96d56Sopenharmony_ci 25537db96d56Sopenharmony_ci args = ("bad.py", 1, 2, "abcdefg", 1) 25547db96d56Sopenharmony_ci self.assertRaises(TypeError, SyntaxError, "bad bad", args) 25557db96d56Sopenharmony_ci 25567db96d56Sopenharmony_ci 25577db96d56Sopenharmony_ciclass TestInvalidExceptionMatcher(unittest.TestCase): 25587db96d56Sopenharmony_ci def test_except_star_invalid_exception_type(self): 25597db96d56Sopenharmony_ci with self.assertRaises(TypeError): 25607db96d56Sopenharmony_ci try: 25617db96d56Sopenharmony_ci raise ValueError 25627db96d56Sopenharmony_ci except 42: 25637db96d56Sopenharmony_ci pass 25647db96d56Sopenharmony_ci 25657db96d56Sopenharmony_ci with self.assertRaises(TypeError): 25667db96d56Sopenharmony_ci try: 25677db96d56Sopenharmony_ci raise ValueError 25687db96d56Sopenharmony_ci except (ValueError, 42): 25697db96d56Sopenharmony_ci pass 25707db96d56Sopenharmony_ci 25717db96d56Sopenharmony_ci 25727db96d56Sopenharmony_ciclass PEP626Tests(unittest.TestCase): 25737db96d56Sopenharmony_ci 25747db96d56Sopenharmony_ci def lineno_after_raise(self, f, *expected): 25757db96d56Sopenharmony_ci try: 25767db96d56Sopenharmony_ci f() 25777db96d56Sopenharmony_ci except Exception as ex: 25787db96d56Sopenharmony_ci t = ex.__traceback__ 25797db96d56Sopenharmony_ci else: 25807db96d56Sopenharmony_ci self.fail("No exception raised") 25817db96d56Sopenharmony_ci lines = [] 25827db96d56Sopenharmony_ci t = t.tb_next # Skip this function 25837db96d56Sopenharmony_ci while t: 25847db96d56Sopenharmony_ci frame = t.tb_frame 25857db96d56Sopenharmony_ci lines.append( 25867db96d56Sopenharmony_ci None if frame.f_lineno is None else 25877db96d56Sopenharmony_ci frame.f_lineno-frame.f_code.co_firstlineno 25887db96d56Sopenharmony_ci ) 25897db96d56Sopenharmony_ci t = t.tb_next 25907db96d56Sopenharmony_ci self.assertEqual(tuple(lines), expected) 25917db96d56Sopenharmony_ci 25927db96d56Sopenharmony_ci def test_lineno_after_raise_simple(self): 25937db96d56Sopenharmony_ci def simple(): 25947db96d56Sopenharmony_ci 1/0 25957db96d56Sopenharmony_ci pass 25967db96d56Sopenharmony_ci self.lineno_after_raise(simple, 1) 25977db96d56Sopenharmony_ci 25987db96d56Sopenharmony_ci def test_lineno_after_raise_in_except(self): 25997db96d56Sopenharmony_ci def in_except(): 26007db96d56Sopenharmony_ci try: 26017db96d56Sopenharmony_ci 1/0 26027db96d56Sopenharmony_ci except: 26037db96d56Sopenharmony_ci 1/0 26047db96d56Sopenharmony_ci pass 26057db96d56Sopenharmony_ci self.lineno_after_raise(in_except, 4) 26067db96d56Sopenharmony_ci 26077db96d56Sopenharmony_ci def test_lineno_after_other_except(self): 26087db96d56Sopenharmony_ci def other_except(): 26097db96d56Sopenharmony_ci try: 26107db96d56Sopenharmony_ci 1/0 26117db96d56Sopenharmony_ci except TypeError as ex: 26127db96d56Sopenharmony_ci pass 26137db96d56Sopenharmony_ci self.lineno_after_raise(other_except, 3) 26147db96d56Sopenharmony_ci 26157db96d56Sopenharmony_ci def test_lineno_in_named_except(self): 26167db96d56Sopenharmony_ci def in_named_except(): 26177db96d56Sopenharmony_ci try: 26187db96d56Sopenharmony_ci 1/0 26197db96d56Sopenharmony_ci except Exception as ex: 26207db96d56Sopenharmony_ci 1/0 26217db96d56Sopenharmony_ci pass 26227db96d56Sopenharmony_ci self.lineno_after_raise(in_named_except, 4) 26237db96d56Sopenharmony_ci 26247db96d56Sopenharmony_ci def test_lineno_in_try(self): 26257db96d56Sopenharmony_ci def in_try(): 26267db96d56Sopenharmony_ci try: 26277db96d56Sopenharmony_ci 1/0 26287db96d56Sopenharmony_ci finally: 26297db96d56Sopenharmony_ci pass 26307db96d56Sopenharmony_ci self.lineno_after_raise(in_try, 4) 26317db96d56Sopenharmony_ci 26327db96d56Sopenharmony_ci def test_lineno_in_finally_normal(self): 26337db96d56Sopenharmony_ci def in_finally_normal(): 26347db96d56Sopenharmony_ci try: 26357db96d56Sopenharmony_ci pass 26367db96d56Sopenharmony_ci finally: 26377db96d56Sopenharmony_ci 1/0 26387db96d56Sopenharmony_ci pass 26397db96d56Sopenharmony_ci self.lineno_after_raise(in_finally_normal, 4) 26407db96d56Sopenharmony_ci 26417db96d56Sopenharmony_ci def test_lineno_in_finally_except(self): 26427db96d56Sopenharmony_ci def in_finally_except(): 26437db96d56Sopenharmony_ci try: 26447db96d56Sopenharmony_ci 1/0 26457db96d56Sopenharmony_ci finally: 26467db96d56Sopenharmony_ci 1/0 26477db96d56Sopenharmony_ci pass 26487db96d56Sopenharmony_ci self.lineno_after_raise(in_finally_except, 4) 26497db96d56Sopenharmony_ci 26507db96d56Sopenharmony_ci def test_lineno_after_with(self): 26517db96d56Sopenharmony_ci class Noop: 26527db96d56Sopenharmony_ci def __enter__(self): 26537db96d56Sopenharmony_ci return self 26547db96d56Sopenharmony_ci def __exit__(self, *args): 26557db96d56Sopenharmony_ci pass 26567db96d56Sopenharmony_ci def after_with(): 26577db96d56Sopenharmony_ci with Noop(): 26587db96d56Sopenharmony_ci 1/0 26597db96d56Sopenharmony_ci pass 26607db96d56Sopenharmony_ci self.lineno_after_raise(after_with, 2) 26617db96d56Sopenharmony_ci 26627db96d56Sopenharmony_ci def test_missing_lineno_shows_as_none(self): 26637db96d56Sopenharmony_ci def f(): 26647db96d56Sopenharmony_ci 1/0 26657db96d56Sopenharmony_ci self.lineno_after_raise(f, 1) 26667db96d56Sopenharmony_ci f.__code__ = f.__code__.replace(co_linetable=b'\xf8\xf8\xf8\xf9\xf8\xf8\xf8') 26677db96d56Sopenharmony_ci self.lineno_after_raise(f, None) 26687db96d56Sopenharmony_ci 26697db96d56Sopenharmony_ci def test_lineno_after_raise_in_with_exit(self): 26707db96d56Sopenharmony_ci class ExitFails: 26717db96d56Sopenharmony_ci def __enter__(self): 26727db96d56Sopenharmony_ci return self 26737db96d56Sopenharmony_ci def __exit__(self, *args): 26747db96d56Sopenharmony_ci raise ValueError 26757db96d56Sopenharmony_ci 26767db96d56Sopenharmony_ci def after_with(): 26777db96d56Sopenharmony_ci with ExitFails(): 26787db96d56Sopenharmony_ci 1/0 26797db96d56Sopenharmony_ci self.lineno_after_raise(after_with, 1, 1) 26807db96d56Sopenharmony_ci 26817db96d56Sopenharmony_ciif __name__ == '__main__': 26827db96d56Sopenharmony_ci unittest.main() 2683