blob: 6ef529e2b015be884f0588e46d86c7cb48a4531a [file] [log] [blame]
Guido van Rossum3bead091992-01-27 17:00:37 +00001# Python test set -- part 5, built-in exceptions
2
Serhiy Storchakab7853962017-04-08 09:55:07 +03003import copy
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004import os
5import sys
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00006import unittest
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00007import pickle
Barry Warsaw8d109cb2008-05-08 04:26:35 +00008import weakref
Antoine Pitroua7622852011-09-01 21:37:43 +02009import errno
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000010
Martin Panter3263f682016-02-28 03:16:11 +000011from test.support import (TESTFN, captured_stderr, check_impl_detail,
Philip Jenvey8f2b6ad2012-11-14 14:51:44 -080012 check_warnings, cpython_only, gc_collect, run_unittest,
xdegaye56d1f5c2017-10-26 15:09:06 +020013 no_tracing, unlink, import_module, script_helper,
14 SuppressCrashReport)
Richard Oudkerk5562d9d2012-07-28 17:45:28 +010015class NaiveException(Exception):
16 def __init__(self, x):
17 self.x = x
18
19class SlottedNaiveException(Exception):
20 __slots__ = ('x',)
21 def __init__(self, x):
22 self.x = x
23
Martin Panter3263f682016-02-28 03:16:11 +000024class BrokenStrException(Exception):
25 def __str__(self):
26 raise Exception("str() is broken")
27
Guido van Rossum3bead091992-01-27 17:00:37 +000028# XXX This is not really enough, each *operation* should be tested!
29
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000030class ExceptionTests(unittest.TestCase):
Barry Warsawb9c1d3d2001-08-13 23:07:00 +000031
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000032 def raise_catch(self, exc, excname):
33 try:
Collin Winter828f04a2007-08-31 00:04:24 +000034 raise exc("spam")
Guido van Rossumb940e112007-01-10 16:19:56 +000035 except exc as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000036 buf1 = str(err)
37 try:
38 raise exc("spam")
Guido van Rossumb940e112007-01-10 16:19:56 +000039 except exc as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000040 buf2 = str(err)
Ezio Melottib3aedd42010-11-20 19:04:17 +000041 self.assertEqual(buf1, buf2)
42 self.assertEqual(exc.__name__, excname)
Guido van Rossum3bead091992-01-27 17:00:37 +000043
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000044 def testRaising(self):
45 self.raise_catch(AttributeError, "AttributeError")
46 self.assertRaises(AttributeError, getattr, sys, "undefined_attribute")
Guido van Rossum3bead091992-01-27 17:00:37 +000047
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000048 self.raise_catch(EOFError, "EOFError")
49 fp = open(TESTFN, 'w')
50 fp.close()
51 fp = open(TESTFN, 'r')
52 savestdin = sys.stdin
53 try:
54 try:
55 import marshal
Antoine Pitrou4a90ef02012-03-03 02:35:32 +010056 marshal.loads(b'')
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000057 except EOFError:
58 pass
59 finally:
60 sys.stdin = savestdin
61 fp.close()
62 unlink(TESTFN)
Guido van Rossum3bead091992-01-27 17:00:37 +000063
Antoine Pitrou6b4883d2011-10-12 02:54:14 +020064 self.raise_catch(OSError, "OSError")
65 self.assertRaises(OSError, open, 'this file does not exist', 'r')
Guido van Rossum3bead091992-01-27 17:00:37 +000066
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000067 self.raise_catch(ImportError, "ImportError")
68 self.assertRaises(ImportError, __import__, "undefined_module")
Guido van Rossum3bead091992-01-27 17:00:37 +000069
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000070 self.raise_catch(IndexError, "IndexError")
71 x = []
72 self.assertRaises(IndexError, x.__getitem__, 10)
Guido van Rossum3bead091992-01-27 17:00:37 +000073
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000074 self.raise_catch(KeyError, "KeyError")
75 x = {}
76 self.assertRaises(KeyError, x.__getitem__, 'key')
Guido van Rossum3bead091992-01-27 17:00:37 +000077
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000078 self.raise_catch(KeyboardInterrupt, "KeyboardInterrupt")
Guido van Rossum3bead091992-01-27 17:00:37 +000079
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000080 self.raise_catch(MemoryError, "MemoryError")
Guido van Rossum3bead091992-01-27 17:00:37 +000081
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000082 self.raise_catch(NameError, "NameError")
83 try: x = undefined_variable
84 except NameError: pass
Guido van Rossum3bead091992-01-27 17:00:37 +000085
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000086 self.raise_catch(OverflowError, "OverflowError")
87 x = 1
88 for dummy in range(128):
89 x += x # this simply shouldn't blow up
Guido van Rossum3bead091992-01-27 17:00:37 +000090
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000091 self.raise_catch(RuntimeError, "RuntimeError")
Yury Selivanovf488fb42015-07-03 01:04:23 -040092 self.raise_catch(RecursionError, "RecursionError")
Guido van Rossum3bead091992-01-27 17:00:37 +000093
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000094 self.raise_catch(SyntaxError, "SyntaxError")
Georg Brandl7cae87c2006-09-06 06:51:57 +000095 try: exec('/\n')
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000096 except SyntaxError: pass
Guido van Rossum3bead091992-01-27 17:00:37 +000097
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000098 self.raise_catch(IndentationError, "IndentationError")
Fred Drake72e48bd2000-09-08 16:32:34 +000099
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000100 self.raise_catch(TabError, "TabError")
Georg Brandle1b5ac62008-06-04 13:06:58 +0000101 try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n",
102 '<string>', 'exec')
103 except TabError: pass
104 else: self.fail("TabError not raised")
Fred Drake72e48bd2000-09-08 16:32:34 +0000105
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 self.raise_catch(SystemError, "SystemError")
Fred Drake72e48bd2000-09-08 16:32:34 +0000107
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000108 self.raise_catch(SystemExit, "SystemExit")
109 self.assertRaises(SystemExit, sys.exit, 0)
Fred Drake85f36392000-07-11 17:53:00 +0000110
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000111 self.raise_catch(TypeError, "TypeError")
112 try: [] + ()
113 except TypeError: pass
Fred Drake85f36392000-07-11 17:53:00 +0000114
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000115 self.raise_catch(ValueError, "ValueError")
Guido van Rossume63bae62007-07-17 00:34:25 +0000116 self.assertRaises(ValueError, chr, 17<<16)
Guido van Rossum3bead091992-01-27 17:00:37 +0000117
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000118 self.raise_catch(ZeroDivisionError, "ZeroDivisionError")
119 try: x = 1/0
120 except ZeroDivisionError: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000121
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000122 self.raise_catch(Exception, "Exception")
123 try: x = 1/0
Guido van Rossumb940e112007-01-10 16:19:56 +0000124 except Exception as e: pass
Guido van Rossum3bead091992-01-27 17:00:37 +0000125
Yury Selivanovccc897f2015-07-03 01:16:04 -0400126 self.raise_catch(StopAsyncIteration, "StopAsyncIteration")
127
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000128 def testSyntaxErrorMessage(self):
129 # make sure the right exception message is raised for each of
130 # these code fragments
Guido van Rossum3bead091992-01-27 17:00:37 +0000131
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000132 def ckmsg(src, msg):
133 try:
134 compile(src, '<fragment>', 'exec')
Guido van Rossumb940e112007-01-10 16:19:56 +0000135 except SyntaxError as e:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000136 if e.msg != msg:
137 self.fail("expected %s, got %s" % (msg, e.msg))
138 else:
139 self.fail("failed to get expected SyntaxError")
Guido van Rossum3bead091992-01-27 17:00:37 +0000140
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000141 s = '''if 1:
142 try:
143 continue
144 except:
145 pass'''
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000146
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000147 ckmsg(s, "'continue' not properly in loop")
148 ckmsg("continue\n", "'continue' not properly in loop")
Thomas Wouters303de6a2006-04-20 22:42:37 +0000149
Martijn Pieters772d8092017-08-22 21:16:23 +0100150 def testSyntaxErrorMissingParens(self):
151 def ckmsg(src, msg, exception=SyntaxError):
152 try:
153 compile(src, '<fragment>', 'exec')
154 except exception as e:
155 if e.msg != msg:
156 self.fail("expected %s, got %s" % (msg, e.msg))
157 else:
158 self.fail("failed to get expected SyntaxError")
159
160 s = '''print "old style"'''
161 ckmsg(s, "Missing parentheses in call to 'print'. "
162 "Did you mean print(\"old style\")?")
163
164 s = '''print "old style",'''
165 ckmsg(s, "Missing parentheses in call to 'print'. "
166 "Did you mean print(\"old style\", end=\" \")?")
167
168 s = '''exec "old style"'''
169 ckmsg(s, "Missing parentheses in call to 'exec'")
170
171 # should not apply to subclasses, see issue #31161
172 s = '''if True:\nprint "No indent"'''
173 ckmsg(s, "expected an indented block", IndentationError)
174
175 s = '''if True:\n print()\n\texec "mixed tabs and spaces"'''
176 ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError)
177
Serhiy Storchaka65fd0592014-01-21 22:26:52 +0200178 def testSyntaxErrorOffset(self):
179 def check(src, lineno, offset):
180 with self.assertRaises(SyntaxError) as cm:
181 compile(src, '<fragment>', 'exec')
182 self.assertEqual(cm.exception.lineno, lineno)
183 self.assertEqual(cm.exception.offset, offset)
184
185 check('def fact(x):\n\treturn x!\n', 2, 10)
186 check('1 +\n', 1, 4)
187 check('def spam():\n print(1)\n print(2)', 3, 10)
188 check('Python = "Python" +', 1, 20)
189 check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20)
Ammar Askar025eb982018-09-24 17:12:49 -0400190 check('x = "a', 1, 7)
191 check('lambda x: x = 2', 1, 1)
192
193 # Errors thrown by compile.c
194 check('class foo:return 1', 1, 11)
195 check('def f():\n continue', 2, 3)
196 check('def f():\n break', 2, 3)
197 check('try:\n pass\nexcept:\n pass\nexcept ValueError:\n pass', 2, 3)
198
199 # Errors thrown by tokenizer.c
200 check('(0x+1)', 1, 3)
201 check('x = 0xI', 1, 6)
202 check('0010 + 2', 1, 4)
203 check('x = 32e-+4', 1, 8)
204 check('x = 0o9', 1, 6)
205
206 # Errors thrown by symtable.c
Serhiy Storchakab619b092018-11-27 09:40:29 +0200207 check('x = [(yield i) for i in range(3)]', 1, 5)
Ammar Askar025eb982018-09-24 17:12:49 -0400208 check('def f():\n from _ import *', 1, 1)
209 check('def f(x, x):\n pass', 1, 1)
210 check('def f(x):\n nonlocal x', 2, 3)
211 check('def f(x):\n x = 1\n global x', 3, 3)
212 check('nonlocal x', 1, 1)
213 check('def f():\n global x\n nonlocal x', 2, 3)
214
215 # Errors thrown by ast.c
216 check('for 1 in []: pass', 1, 5)
217 check('def f(*):\n pass', 1, 7)
218 check('[*x for x in xs]', 1, 2)
219 check('def f():\n x, y: int', 2, 3)
220 check('(yield i) = 2', 1, 1)
221 check('foo(x for x in range(10), 100)', 1, 5)
222 check('foo(1=2)', 1, 5)
223
224 # Errors thrown by future.c
225 check('from __future__ import doesnt_exist', 1, 1)
226 check('from __future__ import braces', 1, 1)
227 check('x=1\nfrom __future__ import division', 2, 1)
228
Serhiy Storchaka65fd0592014-01-21 22:26:52 +0200229
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +0000230 @cpython_only
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000231 def testSettingException(self):
232 # test that setting an exception at the C level works even if the
233 # exception object can't be constructed.
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000234
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000235 class BadException(Exception):
236 def __init__(self_):
Collin Winter828f04a2007-08-31 00:04:24 +0000237 raise RuntimeError("can't instantiate BadException")
Finn Bockaa3dc452001-12-08 10:15:48 +0000238
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000239 class InvalidException:
240 pass
Thomas Wouters303de6a2006-04-20 22:42:37 +0000241
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000242 def test_capi1():
243 import _testcapi
244 try:
245 _testcapi.raise_exception(BadException, 1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000246 except TypeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000247 exc, err, tb = sys.exc_info()
248 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000249 self.assertEqual(co.co_name, "test_capi1")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000250 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000251 else:
252 self.fail("Expected exception")
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000253
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000254 def test_capi2():
255 import _testcapi
256 try:
257 _testcapi.raise_exception(BadException, 0)
Guido van Rossumb940e112007-01-10 16:19:56 +0000258 except RuntimeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000259 exc, err, tb = sys.exc_info()
260 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000261 self.assertEqual(co.co_name, "__init__")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000262 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000263 co2 = tb.tb_frame.f_back.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000264 self.assertEqual(co2.co_name, "test_capi2")
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000265 else:
266 self.fail("Expected exception")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000267
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000268 def test_capi3():
269 import _testcapi
270 self.assertRaises(SystemError, _testcapi.raise_exception,
271 InvalidException, 1)
272
273 if not sys.platform.startswith('java'):
274 test_capi1()
275 test_capi2()
276 test_capi3()
277
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278 def test_WindowsError(self):
279 try:
280 WindowsError
281 except NameError:
282 pass
283 else:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200284 self.assertIs(WindowsError, OSError)
285 self.assertEqual(str(OSError(1001)), "1001")
286 self.assertEqual(str(OSError(1001, "message")),
287 "[Errno 1001] message")
288 # POSIX errno (9 aka EBADF) is untranslated
289 w = OSError(9, 'foo', 'bar')
290 self.assertEqual(w.errno, 9)
291 self.assertEqual(w.winerror, None)
292 self.assertEqual(str(w), "[Errno 9] foo: 'bar'")
293 # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2)
294 w = OSError(0, 'foo', 'bar', 3)
295 self.assertEqual(w.errno, 2)
296 self.assertEqual(w.winerror, 3)
297 self.assertEqual(w.strerror, 'foo')
298 self.assertEqual(w.filename, 'bar')
Martin Panter5487c132015-10-26 11:05:42 +0000299 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100300 self.assertEqual(str(w), "[WinError 3] foo: 'bar'")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200301 # Unknown win error becomes EINVAL (22)
302 w = OSError(0, 'foo', None, 1001)
303 self.assertEqual(w.errno, 22)
304 self.assertEqual(w.winerror, 1001)
305 self.assertEqual(w.strerror, 'foo')
306 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000307 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100308 self.assertEqual(str(w), "[WinError 1001] foo")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200309 # Non-numeric "errno"
310 w = OSError('bar', 'foo')
311 self.assertEqual(w.errno, 'bar')
312 self.assertEqual(w.winerror, None)
313 self.assertEqual(w.strerror, 'foo')
314 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000315 self.assertEqual(w.filename2, None)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000316
Victor Stinnerd223fa62015-04-02 14:17:38 +0200317 @unittest.skipUnless(sys.platform == 'win32',
318 'test specific to Windows')
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300319 def test_windows_message(self):
320 """Should fill in unknown error code in Windows error message"""
Victor Stinnerd223fa62015-04-02 14:17:38 +0200321 ctypes = import_module('ctypes')
322 # this error code has no message, Python formats it as hexadecimal
323 code = 3765269347
324 with self.assertRaisesRegex(OSError, 'Windows Error 0x%x' % code):
325 ctypes.pythonapi.PyErr_SetFromWindowsErr(code)
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300326
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000327 def testAttributes(self):
328 # test that exception attributes are happy
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000329
330 exceptionList = [
Guido van Rossumebe3e162007-05-17 18:20:34 +0000331 (BaseException, (), {'args' : ()}),
332 (BaseException, (1, ), {'args' : (1,)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000333 (BaseException, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000334 {'args' : ('foo',)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000335 (BaseException, ('foo', 1),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000336 {'args' : ('foo', 1)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000337 (SystemExit, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000338 {'args' : ('foo',), 'code' : 'foo'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200339 (OSError, ('foo',),
Martin Panter5487c132015-10-26 11:05:42 +0000340 {'args' : ('foo',), 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341 'errno' : None, 'strerror' : None}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200342 (OSError, ('foo', 'bar'),
Martin Panter5487c132015-10-26 11:05:42 +0000343 {'args' : ('foo', 'bar'),
344 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000345 'errno' : 'foo', 'strerror' : 'bar'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200346 (OSError, ('foo', 'bar', 'baz'),
Martin Panter5487c132015-10-26 11:05:42 +0000347 {'args' : ('foo', 'bar'),
348 'filename' : 'baz', 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000349 'errno' : 'foo', 'strerror' : 'bar'}),
Larry Hastingsb0827312014-02-09 22:05:19 -0800350 (OSError, ('foo', 'bar', 'baz', None, 'quux'),
351 {'args' : ('foo', 'bar'), 'filename' : 'baz', 'filename2': 'quux'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200352 (OSError, ('errnoStr', 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000353 {'args' : ('errnoStr', 'strErrorStr'),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000354 'strerror' : 'strErrorStr', 'errno' : 'errnoStr',
355 'filename' : 'filenameStr'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200356 (OSError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000357 {'args' : (1, 'strErrorStr'), 'errno' : 1,
Martin Panter5487c132015-10-26 11:05:42 +0000358 'strerror' : 'strErrorStr',
359 'filename' : 'filenameStr', 'filename2' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000360 (SyntaxError, (), {'msg' : None, 'text' : None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000361 'filename' : None, 'lineno' : None, 'offset' : None,
362 'print_file_and_line' : None}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000363 (SyntaxError, ('msgStr',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000364 {'args' : ('msgStr',), 'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000365 'print_file_and_line' : None, 'msg' : 'msgStr',
366 'filename' : None, 'lineno' : None, 'offset' : None}),
367 (SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr',
368 'textStr')),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000369 {'offset' : 'offsetStr', 'text' : 'textStr',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000370 'args' : ('msgStr', ('filenameStr', 'linenoStr',
371 'offsetStr', 'textStr')),
372 'print_file_and_line' : None, 'msg' : 'msgStr',
373 'filename' : 'filenameStr', 'lineno' : 'linenoStr'}),
374 (SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
375 'textStr', 'print_file_and_lineStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000376 {'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000377 'args' : ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
378 'textStr', 'print_file_and_lineStr'),
379 'print_file_and_line' : None, 'msg' : 'msgStr',
380 'filename' : None, 'lineno' : None, 'offset' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000381 (UnicodeError, (), {'args' : (),}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000382 (UnicodeEncodeError, ('ascii', 'a', 0, 1,
383 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000384 {'args' : ('ascii', 'a', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000385 'ordinal not in range'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000386 'encoding' : 'ascii', 'object' : 'a',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000387 'start' : 0, 'reason' : 'ordinal not in range'}),
Guido van Rossum254348e2007-11-21 19:29:53 +0000388 (UnicodeDecodeError, ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000389 'ordinal not in range'),
Guido van Rossum254348e2007-11-21 19:29:53 +0000390 {'args' : ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000391 'ordinal not in range'),
392 'encoding' : 'ascii', 'object' : b'\xff',
393 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000394 (UnicodeDecodeError, ('ascii', b'\xff', 0, 1,
395 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000396 {'args' : ('ascii', b'\xff', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000397 'ordinal not in range'),
Guido van Rossumb8142c32007-05-08 17:49:10 +0000398 'encoding' : 'ascii', 'object' : b'\xff',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000399 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000400 (UnicodeTranslateError, ("\u3042", 0, 1, "ouch"),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000401 {'args' : ('\u3042', 0, 1, 'ouch'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000402 'object' : '\u3042', 'reason' : 'ouch',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000403 'start' : 0, 'end' : 1}),
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100404 (NaiveException, ('foo',),
405 {'args': ('foo',), 'x': 'foo'}),
406 (SlottedNaiveException, ('foo',),
407 {'args': ('foo',), 'x': 'foo'}),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000408 ]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000409 try:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200410 # More tests are in test_WindowsError
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000411 exceptionList.append(
412 (WindowsError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000413 {'args' : (1, 'strErrorStr'),
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200414 'strerror' : 'strErrorStr', 'winerror' : None,
Martin Panter5487c132015-10-26 11:05:42 +0000415 'errno' : 1,
416 'filename' : 'filenameStr', 'filename2' : None})
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000417 )
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000418 except NameError:
419 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000420
Guido van Rossumebe3e162007-05-17 18:20:34 +0000421 for exc, args, expected in exceptionList:
422 try:
423 e = exc(*args)
424 except:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000425 print("\nexc=%r, args=%r" % (exc, args), file=sys.stderr)
Guido van Rossumebe3e162007-05-17 18:20:34 +0000426 raise
427 else:
428 # Verify module name
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100429 if not type(e).__name__.endswith('NaiveException'):
430 self.assertEqual(type(e).__module__, 'builtins')
Guido van Rossumebe3e162007-05-17 18:20:34 +0000431 # Verify no ref leaks in Exc_str()
432 s = str(e)
433 for checkArgName in expected:
434 value = getattr(e, checkArgName)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000435 self.assertEqual(repr(value),
436 repr(expected[checkArgName]),
437 '%r.%s == %r, expected %r' % (
438 e, checkArgName,
439 value, expected[checkArgName]))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000440
Guido van Rossumebe3e162007-05-17 18:20:34 +0000441 # test for pickling support
Guido van Rossum99603b02007-07-20 00:22:32 +0000442 for p in [pickle]:
Guido van Rossumebe3e162007-05-17 18:20:34 +0000443 for protocol in range(p.HIGHEST_PROTOCOL + 1):
444 s = p.dumps(e, protocol)
445 new = p.loads(s)
446 for checkArgName in expected:
447 got = repr(getattr(new, checkArgName))
448 want = repr(expected[checkArgName])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000449 self.assertEqual(got, want,
450 'pickled "%r", attribute "%s' %
451 (e, checkArgName))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000452
Collin Winter828f04a2007-08-31 00:04:24 +0000453 def testWithTraceback(self):
454 try:
455 raise IndexError(4)
456 except:
457 tb = sys.exc_info()[2]
458
459 e = BaseException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000460 self.assertIsInstance(e, BaseException)
Collin Winter828f04a2007-08-31 00:04:24 +0000461 self.assertEqual(e.__traceback__, tb)
462
463 e = IndexError(5).with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000464 self.assertIsInstance(e, IndexError)
Collin Winter828f04a2007-08-31 00:04:24 +0000465 self.assertEqual(e.__traceback__, tb)
466
467 class MyException(Exception):
468 pass
469
470 e = MyException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000471 self.assertIsInstance(e, MyException)
Collin Winter828f04a2007-08-31 00:04:24 +0000472 self.assertEqual(e.__traceback__, tb)
473
474 def testInvalidTraceback(self):
475 try:
476 Exception().__traceback__ = 5
477 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000478 self.assertIn("__traceback__ must be a traceback", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000479 else:
480 self.fail("No exception raised")
481
Georg Brandlab6f2f62009-03-31 04:16:10 +0000482 def testInvalidAttrs(self):
483 self.assertRaises(TypeError, setattr, Exception(), '__cause__', 1)
484 self.assertRaises(TypeError, delattr, Exception(), '__cause__')
485 self.assertRaises(TypeError, setattr, Exception(), '__context__', 1)
486 self.assertRaises(TypeError, delattr, Exception(), '__context__')
487
Collin Winter828f04a2007-08-31 00:04:24 +0000488 def testNoneClearsTracebackAttr(self):
489 try:
490 raise IndexError(4)
491 except:
492 tb = sys.exc_info()[2]
493
494 e = Exception()
495 e.__traceback__ = tb
496 e.__traceback__ = None
497 self.assertEqual(e.__traceback__, None)
498
499 def testChainingAttrs(self):
500 e = Exception()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000501 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700502 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000503
504 e = TypeError()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000505 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700506 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000507
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200508 class MyException(OSError):
Collin Winter828f04a2007-08-31 00:04:24 +0000509 pass
510
511 e = MyException()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000512 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700513 self.assertIsNone(e.__cause__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000514
515 def testChainingDescriptors(self):
516 try:
517 raise Exception()
518 except Exception as exc:
519 e = exc
520
521 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700522 self.assertIsNone(e.__cause__)
523 self.assertFalse(e.__suppress_context__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000524
525 e.__context__ = NameError()
526 e.__cause__ = None
527 self.assertIsInstance(e.__context__, NameError)
528 self.assertIsNone(e.__cause__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700529 self.assertTrue(e.__suppress_context__)
530 e.__suppress_context__ = False
531 self.assertFalse(e.__suppress_context__)
Collin Winter828f04a2007-08-31 00:04:24 +0000532
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000533 def testKeywordArgs(self):
534 # test that builtin exception don't take keyword args,
535 # but user-defined subclasses can if they want
536 self.assertRaises(TypeError, BaseException, a=1)
537
538 class DerivedException(BaseException):
539 def __init__(self, fancy_arg):
540 BaseException.__init__(self)
541 self.fancy_arg = fancy_arg
542
543 x = DerivedException(fancy_arg=42)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000544 self.assertEqual(x.fancy_arg, 42)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000545
Brett Cannon31f59292011-02-21 19:29:56 +0000546 @no_tracing
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000547 def testInfiniteRecursion(self):
548 def f():
549 return f()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400550 self.assertRaises(RecursionError, f)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000551
552 def g():
553 try:
554 return g()
555 except ValueError:
556 return -1
Yury Selivanovf488fb42015-07-03 01:04:23 -0400557 self.assertRaises(RecursionError, g)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000558
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000559 def test_str(self):
560 # Make sure both instances and classes have a str representation.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000561 self.assertTrue(str(Exception))
562 self.assertTrue(str(Exception('a')))
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000563 self.assertTrue(str(Exception('a', 'b')))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000564
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000565 def testExceptionCleanupNames(self):
566 # Make sure the local variable bound to the exception instance by
567 # an "except" statement is only visible inside the except block.
Guido van Rossumb940e112007-01-10 16:19:56 +0000568 try:
569 raise Exception()
570 except Exception as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000571 self.assertTrue(e)
Guido van Rossumb940e112007-01-10 16:19:56 +0000572 del e
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000573 self.assertNotIn('e', locals())
Guido van Rossumb940e112007-01-10 16:19:56 +0000574
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000575 def testExceptionCleanupState(self):
576 # Make sure exception state is cleaned up as soon as the except
577 # block is left. See #2507
578
579 class MyException(Exception):
580 def __init__(self, obj):
581 self.obj = obj
582 class MyObj:
583 pass
584
585 def inner_raising_func():
586 # Create some references in exception value and traceback
587 local_ref = obj
588 raise MyException(obj)
589
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000590 # Qualified "except" with "as"
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000591 obj = MyObj()
592 wr = weakref.ref(obj)
593 try:
594 inner_raising_func()
595 except MyException as e:
596 pass
597 obj = None
598 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300599 self.assertIsNone(obj)
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000600
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000601 # Qualified "except" without "as"
602 obj = MyObj()
603 wr = weakref.ref(obj)
604 try:
605 inner_raising_func()
606 except MyException:
607 pass
608 obj = None
609 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300610 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000611
612 # Bare "except"
613 obj = MyObj()
614 wr = weakref.ref(obj)
615 try:
616 inner_raising_func()
617 except:
618 pass
619 obj = None
620 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300621 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000622
623 # "except" with premature block leave
624 obj = MyObj()
625 wr = weakref.ref(obj)
626 for i in [0]:
627 try:
628 inner_raising_func()
629 except:
630 break
631 obj = None
632 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300633 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000634
635 # "except" block raising another exception
636 obj = MyObj()
637 wr = weakref.ref(obj)
638 try:
639 try:
640 inner_raising_func()
641 except:
642 raise KeyError
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000643 except KeyError as e:
644 # We want to test that the except block above got rid of
645 # the exception raised in inner_raising_func(), but it
646 # also ends up in the __context__ of the KeyError, so we
647 # must clear the latter manually for our test to succeed.
648 e.__context__ = None
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000649 obj = None
650 obj = wr()
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800651 # guarantee no ref cycles on CPython (don't gc_collect)
652 if check_impl_detail(cpython=False):
653 gc_collect()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300654 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000655
656 # Some complicated construct
657 obj = MyObj()
658 wr = weakref.ref(obj)
659 try:
660 inner_raising_func()
661 except MyException:
662 try:
663 try:
664 raise
665 finally:
666 raise
667 except MyException:
668 pass
669 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800670 if check_impl_detail(cpython=False):
671 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000672 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300673 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000674
675 # Inside an exception-silencing "with" block
676 class Context:
677 def __enter__(self):
678 return self
679 def __exit__ (self, exc_type, exc_value, exc_tb):
680 return True
681 obj = MyObj()
682 wr = weakref.ref(obj)
683 with Context():
684 inner_raising_func()
685 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800686 if check_impl_detail(cpython=False):
687 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000688 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300689 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000690
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +0000691 def test_exception_target_in_nested_scope(self):
692 # issue 4617: This used to raise a SyntaxError
693 # "can not delete variable 'e' referenced in nested scope"
694 def print_error():
695 e
696 try:
697 something
698 except Exception as e:
699 print_error()
700 # implicit "del e" here
701
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000702 def test_generator_leaking(self):
703 # Test that generator exception state doesn't leak into the calling
704 # frame
705 def yield_raise():
706 try:
707 raise KeyError("caught")
708 except KeyError:
709 yield sys.exc_info()[0]
710 yield sys.exc_info()[0]
711 yield sys.exc_info()[0]
712 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000713 self.assertEqual(next(g), KeyError)
714 self.assertEqual(sys.exc_info()[0], None)
715 self.assertEqual(next(g), KeyError)
716 self.assertEqual(sys.exc_info()[0], None)
717 self.assertEqual(next(g), None)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000718
719 # Same test, but inside an exception handler
720 try:
721 raise TypeError("foo")
722 except TypeError:
723 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000724 self.assertEqual(next(g), KeyError)
725 self.assertEqual(sys.exc_info()[0], TypeError)
726 self.assertEqual(next(g), KeyError)
727 self.assertEqual(sys.exc_info()[0], TypeError)
728 self.assertEqual(next(g), TypeError)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000729 del g
Ezio Melottib3aedd42010-11-20 19:04:17 +0000730 self.assertEqual(sys.exc_info()[0], TypeError)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000731
Benjamin Peterson83195c32011-07-03 13:44:00 -0500732 def test_generator_leaking2(self):
733 # See issue 12475.
734 def g():
735 yield
736 try:
737 raise RuntimeError
738 except RuntimeError:
739 it = g()
740 next(it)
741 try:
742 next(it)
743 except StopIteration:
744 pass
745 self.assertEqual(sys.exc_info(), (None, None, None))
746
Antoine Pitrouc4c19b32015-03-18 22:22:46 +0100747 def test_generator_leaking3(self):
748 # See issue #23353. When gen.throw() is called, the caller's
749 # exception state should be save and restored.
750 def g():
751 try:
752 yield
753 except ZeroDivisionError:
754 yield sys.exc_info()[1]
755 it = g()
756 next(it)
757 try:
758 1/0
759 except ZeroDivisionError as e:
760 self.assertIs(sys.exc_info()[1], e)
761 gen_exc = it.throw(e)
762 self.assertIs(sys.exc_info()[1], e)
763 self.assertIs(gen_exc, e)
764 self.assertEqual(sys.exc_info(), (None, None, None))
765
766 def test_generator_leaking4(self):
767 # See issue #23353. When an exception is raised by a generator,
768 # the caller's exception state should still be restored.
769 def g():
770 try:
771 1/0
772 except ZeroDivisionError:
773 yield sys.exc_info()[0]
774 raise
775 it = g()
776 try:
777 raise TypeError
778 except TypeError:
779 # The caller's exception state (TypeError) is temporarily
780 # saved in the generator.
781 tp = next(it)
782 self.assertIs(tp, ZeroDivisionError)
783 try:
784 next(it)
785 # We can't check it immediately, but while next() returns
786 # with an exception, it shouldn't have restored the old
787 # exception state (TypeError).
788 except ZeroDivisionError as e:
789 self.assertIs(sys.exc_info()[1], e)
790 # We used to find TypeError here.
791 self.assertEqual(sys.exc_info(), (None, None, None))
792
Benjamin Petersonac913412011-07-03 16:25:11 -0500793 def test_generator_doesnt_retain_old_exc(self):
794 def g():
795 self.assertIsInstance(sys.exc_info()[1], RuntimeError)
796 yield
797 self.assertEqual(sys.exc_info(), (None, None, None))
798 it = g()
799 try:
800 raise RuntimeError
801 except RuntimeError:
802 next(it)
803 self.assertRaises(StopIteration, next, it)
804
Benjamin Petersonae5f2f42010-03-07 17:10:51 +0000805 def test_generator_finalizing_and_exc_info(self):
806 # See #7173
807 def simple_gen():
808 yield 1
809 def run_gen():
810 gen = simple_gen()
811 try:
812 raise RuntimeError
813 except RuntimeError:
814 return next(gen)
815 run_gen()
816 gc_collect()
817 self.assertEqual(sys.exc_info(), (None, None, None))
818
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200819 def _check_generator_cleanup_exc_state(self, testfunc):
820 # Issue #12791: exception state is cleaned up as soon as a generator
821 # is closed (reference cycles are broken).
822 class MyException(Exception):
823 def __init__(self, obj):
824 self.obj = obj
825 class MyObj:
826 pass
827
828 def raising_gen():
829 try:
830 raise MyException(obj)
831 except MyException:
832 yield
833
834 obj = MyObj()
835 wr = weakref.ref(obj)
836 g = raising_gen()
837 next(g)
838 testfunc(g)
839 g = obj = None
840 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300841 self.assertIsNone(obj)
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200842
843 def test_generator_throw_cleanup_exc_state(self):
844 def do_throw(g):
845 try:
846 g.throw(RuntimeError())
847 except RuntimeError:
848 pass
849 self._check_generator_cleanup_exc_state(do_throw)
850
851 def test_generator_close_cleanup_exc_state(self):
852 def do_close(g):
853 g.close()
854 self._check_generator_cleanup_exc_state(do_close)
855
856 def test_generator_del_cleanup_exc_state(self):
857 def do_del(g):
858 g = None
859 self._check_generator_cleanup_exc_state(do_del)
860
861 def test_generator_next_cleanup_exc_state(self):
862 def do_next(g):
863 try:
864 next(g)
865 except StopIteration:
866 pass
867 else:
868 self.fail("should have raised StopIteration")
869 self._check_generator_cleanup_exc_state(do_next)
870
871 def test_generator_send_cleanup_exc_state(self):
872 def do_send(g):
873 try:
874 g.send(None)
875 except StopIteration:
876 pass
877 else:
878 self.fail("should have raised StopIteration")
879 self._check_generator_cleanup_exc_state(do_send)
880
Benjamin Peterson27d63672008-06-15 20:09:12 +0000881 def test_3114(self):
882 # Bug #3114: in its destructor, MyObject retrieves a pointer to
883 # obsolete and/or deallocated objects.
Benjamin Peterson979f3112008-06-15 00:05:44 +0000884 class MyObject:
885 def __del__(self):
886 nonlocal e
887 e = sys.exc_info()
888 e = ()
889 try:
890 raise Exception(MyObject())
891 except:
892 pass
Ezio Melottib3aedd42010-11-20 19:04:17 +0000893 self.assertEqual(e, (None, None, None))
Benjamin Peterson979f3112008-06-15 00:05:44 +0000894
Benjamin Peterson24dfb052014-04-02 12:05:35 -0400895 def test_unicode_change_attributes(self):
Eric Smith0facd772010-02-24 15:42:29 +0000896 # See issue 7309. This was a crasher.
897
898 u = UnicodeEncodeError('baz', 'xxxxx', 1, 5, 'foo')
899 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: foo")
900 u.end = 2
901 self.assertEqual(str(u), "'baz' codec can't encode character '\\x78' in position 1: foo")
902 u.end = 5
903 u.reason = 0x345345345345345345
904 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: 965230951443685724997")
905 u.encoding = 4000
906 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1-4: 965230951443685724997")
907 u.start = 1000
908 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1000-4: 965230951443685724997")
909
910 u = UnicodeDecodeError('baz', b'xxxxx', 1, 5, 'foo')
911 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: foo")
912 u.end = 2
913 self.assertEqual(str(u), "'baz' codec can't decode byte 0x78 in position 1: foo")
914 u.end = 5
915 u.reason = 0x345345345345345345
916 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: 965230951443685724997")
917 u.encoding = 4000
918 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1-4: 965230951443685724997")
919 u.start = 1000
920 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1000-4: 965230951443685724997")
921
922 u = UnicodeTranslateError('xxxx', 1, 5, 'foo')
923 self.assertEqual(str(u), "can't translate characters in position 1-4: foo")
924 u.end = 2
925 self.assertEqual(str(u), "can't translate character '\\x78' in position 1: foo")
926 u.end = 5
927 u.reason = 0x345345345345345345
928 self.assertEqual(str(u), "can't translate characters in position 1-4: 965230951443685724997")
929 u.start = 1000
930 self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997")
Benjamin Peterson6e7740c2008-08-20 23:23:34 +0000931
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400932 def test_unicode_errors_no_object(self):
933 # See issue #21134.
Benjamin Petersone3311212014-04-02 15:51:38 -0400934 klasses = UnicodeEncodeError, UnicodeDecodeError, UnicodeTranslateError
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400935 for klass in klasses:
936 self.assertEqual(str(klass.__new__(klass)), "")
937
Brett Cannon31f59292011-02-21 19:29:56 +0000938 @no_tracing
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000939 def test_badisinstance(self):
940 # Bug #2542: if issubclass(e, MyException) raises an exception,
941 # it should be ignored
942 class Meta(type):
943 def __subclasscheck__(cls, subclass):
944 raise ValueError()
945 class MyException(Exception, metaclass=Meta):
946 pass
947
Martin Panter3263f682016-02-28 03:16:11 +0000948 with captured_stderr() as stderr:
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000949 try:
950 raise KeyError()
951 except MyException as e:
952 self.fail("exception should not be a MyException")
953 except KeyError:
954 pass
955 except:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000956 self.fail("Should have raised KeyError")
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000957 else:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000958 self.fail("Should have raised KeyError")
959
960 def g():
961 try:
962 return g()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400963 except RecursionError:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000964 return sys.exc_info()
965 e, v, tb = g()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300966 self.assertIsInstance(v, RecursionError, type(v))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000967 self.assertIn("maximum recursion depth exceeded", str(v))
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000968
xdegaye56d1f5c2017-10-26 15:09:06 +0200969 @cpython_only
970 def test_recursion_normalizing_exception(self):
971 # Issue #22898.
972 # Test that a RecursionError is raised when tstate->recursion_depth is
973 # equal to recursion_limit in PyErr_NormalizeException() and check
974 # that a ResourceWarning is printed.
975 # Prior to #22898, the recursivity of PyErr_NormalizeException() was
luzpaza5293b42017-11-05 07:37:50 -0600976 # controlled by tstate->recursion_depth and a PyExc_RecursionErrorInst
xdegaye56d1f5c2017-10-26 15:09:06 +0200977 # singleton was being used in that case, that held traceback data and
978 # locals indefinitely and would cause a segfault in _PyExc_Fini() upon
979 # finalization of these locals.
980 code = """if 1:
981 import sys
982 from _testcapi import get_recursion_depth
983
984 class MyException(Exception): pass
985
986 def setrecursionlimit(depth):
987 while 1:
988 try:
989 sys.setrecursionlimit(depth)
990 return depth
991 except RecursionError:
992 # sys.setrecursionlimit() raises a RecursionError if
993 # the new recursion limit is too low (issue #25274).
994 depth += 1
995
996 def recurse(cnt):
997 cnt -= 1
998 if cnt:
999 recurse(cnt)
1000 else:
1001 generator.throw(MyException)
1002
1003 def gen():
1004 f = open(%a, mode='rb', buffering=0)
1005 yield
1006
1007 generator = gen()
1008 next(generator)
1009 recursionlimit = sys.getrecursionlimit()
1010 depth = get_recursion_depth()
1011 try:
1012 # Upon the last recursive invocation of recurse(),
1013 # tstate->recursion_depth is equal to (recursion_limit - 1)
1014 # and is equal to recursion_limit when _gen_throw() calls
1015 # PyErr_NormalizeException().
1016 recurse(setrecursionlimit(depth + 2) - depth - 1)
1017 finally:
1018 sys.setrecursionlimit(recursionlimit)
1019 print('Done.')
1020 """ % __file__
1021 rc, out, err = script_helper.assert_python_failure("-Wd", "-c", code)
1022 # Check that the program does not fail with SIGABRT.
1023 self.assertEqual(rc, 1)
1024 self.assertIn(b'RecursionError', err)
1025 self.assertIn(b'ResourceWarning', err)
1026 self.assertIn(b'Done.', out)
1027
1028 @cpython_only
1029 def test_recursion_normalizing_infinite_exception(self):
1030 # Issue #30697. Test that a RecursionError is raised when
1031 # PyErr_NormalizeException() maximum recursion depth has been
1032 # exceeded.
1033 code = """if 1:
1034 import _testcapi
1035 try:
1036 raise _testcapi.RecursingInfinitelyError
1037 finally:
1038 print('Done.')
1039 """
1040 rc, out, err = script_helper.assert_python_failure("-c", code)
1041 self.assertEqual(rc, 1)
1042 self.assertIn(b'RecursionError: maximum recursion depth exceeded '
1043 b'while normalizing an exception', err)
1044 self.assertIn(b'Done.', out)
1045
1046 @cpython_only
1047 def test_recursion_normalizing_with_no_memory(self):
1048 # Issue #30697. Test that in the abort that occurs when there is no
1049 # memory left and the size of the Python frames stack is greater than
1050 # the size of the list of preallocated MemoryError instances, the
1051 # Fatal Python error message mentions MemoryError.
1052 code = """if 1:
1053 import _testcapi
1054 class C(): pass
1055 def recurse(cnt):
1056 cnt -= 1
1057 if cnt:
1058 recurse(cnt)
1059 else:
1060 _testcapi.set_nomemory(0)
1061 C()
1062 recurse(16)
1063 """
1064 with SuppressCrashReport():
1065 rc, out, err = script_helper.assert_python_failure("-c", code)
1066 self.assertIn(b'Fatal Python error: Cannot recover from '
1067 b'MemoryErrors while normalizing exceptions.', err)
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001068
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001069 @cpython_only
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001070 def test_MemoryError(self):
1071 # PyErr_NoMemory always raises the same exception instance.
1072 # Check that the traceback is not doubled.
1073 import traceback
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001074 from _testcapi import raise_memoryerror
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001075 def raiseMemError():
1076 try:
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001077 raise_memoryerror()
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001078 except MemoryError as e:
1079 tb = e.__traceback__
1080 else:
1081 self.fail("Should have raises a MemoryError")
1082 return traceback.format_tb(tb)
1083
1084 tb1 = raiseMemError()
1085 tb2 = raiseMemError()
1086 self.assertEqual(tb1, tb2)
1087
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +00001088 @cpython_only
Georg Brandl1e28a272009-12-28 08:41:01 +00001089 def test_exception_with_doc(self):
1090 import _testcapi
1091 doc2 = "This is a test docstring."
1092 doc4 = "This is another test docstring."
1093
1094 self.assertRaises(SystemError, _testcapi.make_exception_with_doc,
1095 "error1")
1096
1097 # test basic usage of PyErr_NewException
1098 error1 = _testcapi.make_exception_with_doc("_testcapi.error1")
1099 self.assertIs(type(error1), type)
1100 self.assertTrue(issubclass(error1, Exception))
1101 self.assertIsNone(error1.__doc__)
1102
1103 # test with given docstring
1104 error2 = _testcapi.make_exception_with_doc("_testcapi.error2", doc2)
1105 self.assertEqual(error2.__doc__, doc2)
1106
1107 # test with explicit base (without docstring)
1108 error3 = _testcapi.make_exception_with_doc("_testcapi.error3",
1109 base=error2)
1110 self.assertTrue(issubclass(error3, error2))
1111
1112 # test with explicit base tuple
1113 class C(object):
1114 pass
1115 error4 = _testcapi.make_exception_with_doc("_testcapi.error4", doc4,
1116 (error3, C))
1117 self.assertTrue(issubclass(error4, error3))
1118 self.assertTrue(issubclass(error4, C))
1119 self.assertEqual(error4.__doc__, doc4)
1120
1121 # test with explicit dictionary
1122 error5 = _testcapi.make_exception_with_doc("_testcapi.error5", "",
1123 error4, {'a': 1})
1124 self.assertTrue(issubclass(error5, error4))
1125 self.assertEqual(error5.a, 1)
1126 self.assertEqual(error5.__doc__, "")
1127
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001128 @cpython_only
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001129 def test_memory_error_cleanup(self):
1130 # Issue #5437: preallocated MemoryError instances should not keep
1131 # traceback objects alive.
1132 from _testcapi import raise_memoryerror
1133 class C:
1134 pass
1135 wr = None
1136 def inner():
1137 nonlocal wr
1138 c = C()
1139 wr = weakref.ref(c)
1140 raise_memoryerror()
1141 # We cannot use assertRaises since it manually deletes the traceback
1142 try:
1143 inner()
1144 except MemoryError as e:
1145 self.assertNotEqual(wr(), None)
1146 else:
1147 self.fail("MemoryError not raised")
1148 self.assertEqual(wr(), None)
1149
Brett Cannon31f59292011-02-21 19:29:56 +00001150 @no_tracing
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001151 def test_recursion_error_cleanup(self):
1152 # Same test as above, but with "recursion exceeded" errors
1153 class C:
1154 pass
1155 wr = None
1156 def inner():
1157 nonlocal wr
1158 c = C()
1159 wr = weakref.ref(c)
1160 inner()
1161 # We cannot use assertRaises since it manually deletes the traceback
1162 try:
1163 inner()
Yury Selivanovf488fb42015-07-03 01:04:23 -04001164 except RecursionError as e:
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001165 self.assertNotEqual(wr(), None)
1166 else:
Yury Selivanovf488fb42015-07-03 01:04:23 -04001167 self.fail("RecursionError not raised")
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001168 self.assertEqual(wr(), None)
Georg Brandl1e28a272009-12-28 08:41:01 +00001169
Antoine Pitroua7622852011-09-01 21:37:43 +02001170 def test_errno_ENOTDIR(self):
1171 # Issue #12802: "not a directory" errors are ENOTDIR even on Windows
1172 with self.assertRaises(OSError) as cm:
1173 os.listdir(__file__)
1174 self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception)
1175
Martin Panter3263f682016-02-28 03:16:11 +00001176 def test_unraisable(self):
1177 # Issue #22836: PyErr_WriteUnraisable() should give sensible reports
1178 class BrokenDel:
1179 def __del__(self):
1180 exc = ValueError("del is broken")
1181 # The following line is included in the traceback report:
1182 raise exc
1183
Martin Panter3263f682016-02-28 03:16:11 +00001184 class BrokenExceptionDel:
1185 def __del__(self):
1186 exc = BrokenStrException()
1187 # The following line is included in the traceback report:
1188 raise exc
1189
Victor Stinner331bbe62017-02-09 23:49:50 +01001190 for test_class in (BrokenDel, BrokenExceptionDel):
Martin Panter3263f682016-02-28 03:16:11 +00001191 with self.subTest(test_class):
1192 obj = test_class()
1193 with captured_stderr() as stderr:
1194 del obj
1195 report = stderr.getvalue()
1196 self.assertIn("Exception ignored", report)
Victor Stinner331bbe62017-02-09 23:49:50 +01001197 self.assertIn(test_class.__del__.__qualname__, report)
Martin Panter3263f682016-02-28 03:16:11 +00001198 self.assertIn("test_exceptions.py", report)
1199 self.assertIn("raise exc", report)
1200 if test_class is BrokenExceptionDel:
1201 self.assertIn("BrokenStrException", report)
1202 self.assertIn("<exception str() failed>", report)
1203 else:
1204 self.assertIn("ValueError", report)
1205 self.assertIn("del is broken", report)
1206 self.assertTrue(report.endswith("\n"))
1207
1208 def test_unhandled(self):
1209 # Check for sensible reporting of unhandled exceptions
1210 for exc_type in (ValueError, BrokenStrException):
1211 with self.subTest(exc_type):
1212 try:
1213 exc = exc_type("test message")
1214 # The following line is included in the traceback report:
1215 raise exc
1216 except exc_type:
1217 with captured_stderr() as stderr:
1218 sys.__excepthook__(*sys.exc_info())
1219 report = stderr.getvalue()
1220 self.assertIn("test_exceptions.py", report)
1221 self.assertIn("raise exc", report)
1222 self.assertIn(exc_type.__name__, report)
1223 if exc_type is BrokenStrException:
1224 self.assertIn("<exception str() failed>", report)
1225 else:
1226 self.assertIn("test message", report)
1227 self.assertTrue(report.endswith("\n"))
1228
xdegaye66caacf2017-10-23 18:08:41 +02001229 @cpython_only
1230 def test_memory_error_in_PyErr_PrintEx(self):
1231 code = """if 1:
1232 import _testcapi
1233 class C(): pass
1234 _testcapi.set_nomemory(0, %d)
1235 C()
1236 """
1237
1238 # Issue #30817: Abort in PyErr_PrintEx() when no memory.
1239 # Span a large range of tests as the CPython code always evolves with
1240 # changes that add or remove memory allocations.
1241 for i in range(1, 20):
1242 rc, out, err = script_helper.assert_python_failure("-c", code % i)
1243 self.assertIn(rc, (1, 120))
1244 self.assertIn(b'MemoryError', err)
1245
Mark Shannonae3087c2017-10-22 22:41:51 +01001246 def test_yield_in_nested_try_excepts(self):
1247 #Issue #25612
1248 class MainError(Exception):
1249 pass
1250
1251 class SubError(Exception):
1252 pass
1253
1254 def main():
1255 try:
1256 raise MainError()
1257 except MainError:
1258 try:
1259 yield
1260 except SubError:
1261 pass
1262 raise
1263
1264 coro = main()
1265 coro.send(None)
1266 with self.assertRaises(MainError):
1267 coro.throw(SubError())
1268
1269 def test_generator_doesnt_retain_old_exc2(self):
1270 #Issue 28884#msg282532
1271 def g():
1272 try:
1273 raise ValueError
1274 except ValueError:
1275 yield 1
1276 self.assertEqual(sys.exc_info(), (None, None, None))
1277 yield 2
1278
1279 gen = g()
1280
1281 try:
1282 raise IndexError
1283 except IndexError:
1284 self.assertEqual(next(gen), 1)
1285 self.assertEqual(next(gen), 2)
1286
1287 def test_raise_in_generator(self):
1288 #Issue 25612#msg304117
1289 def g():
1290 yield 1
1291 raise
1292 yield 2
1293
1294 with self.assertRaises(ZeroDivisionError):
1295 i = g()
1296 try:
1297 1/0
1298 except:
1299 next(i)
1300 next(i)
1301
Antoine Pitroua7622852011-09-01 21:37:43 +02001302
Brett Cannon79ec55e2012-04-12 20:24:54 -04001303class ImportErrorTests(unittest.TestCase):
1304
1305 def test_attributes(self):
1306 # Setting 'name' and 'path' should not be a problem.
1307 exc = ImportError('test')
1308 self.assertIsNone(exc.name)
1309 self.assertIsNone(exc.path)
1310
1311 exc = ImportError('test', name='somemodule')
1312 self.assertEqual(exc.name, 'somemodule')
1313 self.assertIsNone(exc.path)
1314
1315 exc = ImportError('test', path='somepath')
1316 self.assertEqual(exc.path, 'somepath')
1317 self.assertIsNone(exc.name)
1318
1319 exc = ImportError('test', path='somepath', name='somename')
1320 self.assertEqual(exc.name, 'somename')
1321 self.assertEqual(exc.path, 'somepath')
1322
Michael Seifert64c8f702017-04-09 09:47:12 +02001323 msg = "'invalid' is an invalid keyword argument for ImportError"
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001324 with self.assertRaisesRegex(TypeError, msg):
1325 ImportError('test', invalid='keyword')
1326
1327 with self.assertRaisesRegex(TypeError, msg):
1328 ImportError('test', name='name', invalid='keyword')
1329
1330 with self.assertRaisesRegex(TypeError, msg):
1331 ImportError('test', path='path', invalid='keyword')
1332
1333 with self.assertRaisesRegex(TypeError, msg):
1334 ImportError(invalid='keyword')
1335
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001336 with self.assertRaisesRegex(TypeError, msg):
1337 ImportError('test', invalid='keyword', another=True)
1338
Serhiy Storchakae9e44482016-09-28 07:53:32 +03001339 def test_reset_attributes(self):
1340 exc = ImportError('test', name='name', path='path')
1341 self.assertEqual(exc.args, ('test',))
1342 self.assertEqual(exc.msg, 'test')
1343 self.assertEqual(exc.name, 'name')
1344 self.assertEqual(exc.path, 'path')
1345
1346 # Reset not specified attributes
1347 exc.__init__()
1348 self.assertEqual(exc.args, ())
1349 self.assertEqual(exc.msg, None)
1350 self.assertEqual(exc.name, None)
1351 self.assertEqual(exc.path, None)
1352
Brett Cannon07c6e712012-08-24 13:05:09 -04001353 def test_non_str_argument(self):
1354 # Issue #15778
Nadeem Vawda6d708702012-10-14 01:42:32 +02001355 with check_warnings(('', BytesWarning), quiet=True):
1356 arg = b'abc'
1357 exc = ImportError(arg)
1358 self.assertEqual(str(arg), str(exc))
Brett Cannon79ec55e2012-04-12 20:24:54 -04001359
Serhiy Storchakab7853962017-04-08 09:55:07 +03001360 def test_copy_pickle(self):
1361 for kwargs in (dict(),
1362 dict(name='somename'),
1363 dict(path='somepath'),
1364 dict(name='somename', path='somepath')):
1365 orig = ImportError('test', **kwargs)
1366 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1367 exc = pickle.loads(pickle.dumps(orig, proto))
1368 self.assertEqual(exc.args, ('test',))
1369 self.assertEqual(exc.msg, 'test')
1370 self.assertEqual(exc.name, orig.name)
1371 self.assertEqual(exc.path, orig.path)
1372 for c in copy.copy, copy.deepcopy:
1373 exc = c(orig)
1374 self.assertEqual(exc.args, ('test',))
1375 self.assertEqual(exc.msg, 'test')
1376 self.assertEqual(exc.name, orig.name)
1377 self.assertEqual(exc.path, orig.path)
1378
Brett Cannon79ec55e2012-04-12 20:24:54 -04001379
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001380if __name__ == '__main__':
Guido van Rossumb8142c32007-05-08 17:49:10 +00001381 unittest.main()