blob: 8dceb5c8e7963584ca0bc9143930a3274862e4ef [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 = '''while 1:
142 try:
143 pass
144 finally:
145 continue'''
Barry Warsaw992cb8a2000-05-25 23:16:54 +0000146
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000147 if not sys.platform.startswith('java'):
148 ckmsg(s, "'continue' not supported inside 'finally' clause")
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000149
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000150 s = '''if 1:
151 try:
152 continue
153 except:
154 pass'''
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000155
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000156 ckmsg(s, "'continue' not properly in loop")
157 ckmsg("continue\n", "'continue' not properly in loop")
Thomas Wouters303de6a2006-04-20 22:42:37 +0000158
Martijn Pieters772d8092017-08-22 21:16:23 +0100159 def testSyntaxErrorMissingParens(self):
160 def ckmsg(src, msg, exception=SyntaxError):
161 try:
162 compile(src, '<fragment>', 'exec')
163 except exception as e:
164 if e.msg != msg:
165 self.fail("expected %s, got %s" % (msg, e.msg))
166 else:
167 self.fail("failed to get expected SyntaxError")
168
169 s = '''print "old style"'''
170 ckmsg(s, "Missing parentheses in call to 'print'. "
171 "Did you mean print(\"old style\")?")
172
173 s = '''print "old style",'''
174 ckmsg(s, "Missing parentheses in call to 'print'. "
175 "Did you mean print(\"old style\", end=\" \")?")
176
177 s = '''exec "old style"'''
178 ckmsg(s, "Missing parentheses in call to 'exec'")
179
180 # should not apply to subclasses, see issue #31161
181 s = '''if True:\nprint "No indent"'''
182 ckmsg(s, "expected an indented block", IndentationError)
183
184 s = '''if True:\n print()\n\texec "mixed tabs and spaces"'''
185 ckmsg(s, "inconsistent use of tabs and spaces in indentation", TabError)
186
Serhiy Storchaka65fd0592014-01-21 22:26:52 +0200187 def testSyntaxErrorOffset(self):
188 def check(src, lineno, offset):
189 with self.assertRaises(SyntaxError) as cm:
190 compile(src, '<fragment>', 'exec')
191 self.assertEqual(cm.exception.lineno, lineno)
192 self.assertEqual(cm.exception.offset, offset)
193
194 check('def fact(x):\n\treturn x!\n', 2, 10)
195 check('1 +\n', 1, 4)
196 check('def spam():\n print(1)\n print(2)', 3, 10)
197 check('Python = "Python" +', 1, 20)
198 check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20)
199
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +0000200 @cpython_only
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000201 def testSettingException(self):
202 # test that setting an exception at the C level works even if the
203 # exception object can't be constructed.
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000204
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000205 class BadException(Exception):
206 def __init__(self_):
Collin Winter828f04a2007-08-31 00:04:24 +0000207 raise RuntimeError("can't instantiate BadException")
Finn Bockaa3dc452001-12-08 10:15:48 +0000208
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000209 class InvalidException:
210 pass
Thomas Wouters303de6a2006-04-20 22:42:37 +0000211
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000212 def test_capi1():
213 import _testcapi
214 try:
215 _testcapi.raise_exception(BadException, 1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000216 except TypeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000217 exc, err, tb = sys.exc_info()
218 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000219 self.assertEqual(co.co_name, "test_capi1")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000220 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000221 else:
222 self.fail("Expected exception")
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000223
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000224 def test_capi2():
225 import _testcapi
226 try:
227 _testcapi.raise_exception(BadException, 0)
Guido van Rossumb940e112007-01-10 16:19:56 +0000228 except RuntimeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000229 exc, err, tb = sys.exc_info()
230 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000231 self.assertEqual(co.co_name, "__init__")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000232 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000233 co2 = tb.tb_frame.f_back.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000234 self.assertEqual(co2.co_name, "test_capi2")
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000235 else:
236 self.fail("Expected exception")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000237
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000238 def test_capi3():
239 import _testcapi
240 self.assertRaises(SystemError, _testcapi.raise_exception,
241 InvalidException, 1)
242
243 if not sys.platform.startswith('java'):
244 test_capi1()
245 test_capi2()
246 test_capi3()
247
Thomas Wouters89f507f2006-12-13 04:49:30 +0000248 def test_WindowsError(self):
249 try:
250 WindowsError
251 except NameError:
252 pass
253 else:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200254 self.assertIs(WindowsError, OSError)
255 self.assertEqual(str(OSError(1001)), "1001")
256 self.assertEqual(str(OSError(1001, "message")),
257 "[Errno 1001] message")
258 # POSIX errno (9 aka EBADF) is untranslated
259 w = OSError(9, 'foo', 'bar')
260 self.assertEqual(w.errno, 9)
261 self.assertEqual(w.winerror, None)
262 self.assertEqual(str(w), "[Errno 9] foo: 'bar'")
263 # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2)
264 w = OSError(0, 'foo', 'bar', 3)
265 self.assertEqual(w.errno, 2)
266 self.assertEqual(w.winerror, 3)
267 self.assertEqual(w.strerror, 'foo')
268 self.assertEqual(w.filename, 'bar')
Martin Panter5487c132015-10-26 11:05:42 +0000269 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100270 self.assertEqual(str(w), "[WinError 3] foo: 'bar'")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200271 # Unknown win error becomes EINVAL (22)
272 w = OSError(0, 'foo', None, 1001)
273 self.assertEqual(w.errno, 22)
274 self.assertEqual(w.winerror, 1001)
275 self.assertEqual(w.strerror, 'foo')
276 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000277 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100278 self.assertEqual(str(w), "[WinError 1001] foo")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200279 # Non-numeric "errno"
280 w = OSError('bar', 'foo')
281 self.assertEqual(w.errno, 'bar')
282 self.assertEqual(w.winerror, None)
283 self.assertEqual(w.strerror, 'foo')
284 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000285 self.assertEqual(w.filename2, None)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000286
Victor Stinnerd223fa62015-04-02 14:17:38 +0200287 @unittest.skipUnless(sys.platform == 'win32',
288 'test specific to Windows')
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300289 def test_windows_message(self):
290 """Should fill in unknown error code in Windows error message"""
Victor Stinnerd223fa62015-04-02 14:17:38 +0200291 ctypes = import_module('ctypes')
292 # this error code has no message, Python formats it as hexadecimal
293 code = 3765269347
294 with self.assertRaisesRegex(OSError, 'Windows Error 0x%x' % code):
295 ctypes.pythonapi.PyErr_SetFromWindowsErr(code)
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300296
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000297 def testAttributes(self):
298 # test that exception attributes are happy
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000299
300 exceptionList = [
Guido van Rossumebe3e162007-05-17 18:20:34 +0000301 (BaseException, (), {'args' : ()}),
302 (BaseException, (1, ), {'args' : (1,)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000303 (BaseException, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000304 {'args' : ('foo',)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000305 (BaseException, ('foo', 1),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000306 {'args' : ('foo', 1)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000307 (SystemExit, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000308 {'args' : ('foo',), 'code' : 'foo'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200309 (OSError, ('foo',),
Martin Panter5487c132015-10-26 11:05:42 +0000310 {'args' : ('foo',), 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000311 'errno' : None, 'strerror' : None}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200312 (OSError, ('foo', 'bar'),
Martin Panter5487c132015-10-26 11:05:42 +0000313 {'args' : ('foo', 'bar'),
314 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000315 'errno' : 'foo', 'strerror' : 'bar'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200316 (OSError, ('foo', 'bar', 'baz'),
Martin Panter5487c132015-10-26 11:05:42 +0000317 {'args' : ('foo', 'bar'),
318 'filename' : 'baz', 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000319 'errno' : 'foo', 'strerror' : 'bar'}),
Larry Hastingsb0827312014-02-09 22:05:19 -0800320 (OSError, ('foo', 'bar', 'baz', None, 'quux'),
321 {'args' : ('foo', 'bar'), 'filename' : 'baz', 'filename2': 'quux'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200322 (OSError, ('errnoStr', 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000323 {'args' : ('errnoStr', 'strErrorStr'),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000324 'strerror' : 'strErrorStr', 'errno' : 'errnoStr',
325 'filename' : 'filenameStr'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200326 (OSError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000327 {'args' : (1, 'strErrorStr'), 'errno' : 1,
Martin Panter5487c132015-10-26 11:05:42 +0000328 'strerror' : 'strErrorStr',
329 'filename' : 'filenameStr', 'filename2' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000330 (SyntaxError, (), {'msg' : None, 'text' : None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000331 'filename' : None, 'lineno' : None, 'offset' : None,
332 'print_file_and_line' : None}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000333 (SyntaxError, ('msgStr',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000334 {'args' : ('msgStr',), 'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000335 'print_file_and_line' : None, 'msg' : 'msgStr',
336 'filename' : None, 'lineno' : None, 'offset' : None}),
337 (SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr',
338 'textStr')),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000339 {'offset' : 'offsetStr', 'text' : 'textStr',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000340 'args' : ('msgStr', ('filenameStr', 'linenoStr',
341 'offsetStr', 'textStr')),
342 'print_file_and_line' : None, 'msg' : 'msgStr',
343 'filename' : 'filenameStr', 'lineno' : 'linenoStr'}),
344 (SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
345 'textStr', 'print_file_and_lineStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000346 {'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000347 'args' : ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
348 'textStr', 'print_file_and_lineStr'),
349 'print_file_and_line' : None, 'msg' : 'msgStr',
350 'filename' : None, 'lineno' : None, 'offset' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000351 (UnicodeError, (), {'args' : (),}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000352 (UnicodeEncodeError, ('ascii', 'a', 0, 1,
353 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000354 {'args' : ('ascii', 'a', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000355 'ordinal not in range'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000356 'encoding' : 'ascii', 'object' : 'a',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000357 'start' : 0, 'reason' : 'ordinal not in range'}),
Guido van Rossum254348e2007-11-21 19:29:53 +0000358 (UnicodeDecodeError, ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000359 'ordinal not in range'),
Guido van Rossum254348e2007-11-21 19:29:53 +0000360 {'args' : ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000361 'ordinal not in range'),
362 'encoding' : 'ascii', 'object' : b'\xff',
363 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000364 (UnicodeDecodeError, ('ascii', b'\xff', 0, 1,
365 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000366 {'args' : ('ascii', b'\xff', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000367 'ordinal not in range'),
Guido van Rossumb8142c32007-05-08 17:49:10 +0000368 'encoding' : 'ascii', 'object' : b'\xff',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000369 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000370 (UnicodeTranslateError, ("\u3042", 0, 1, "ouch"),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000371 {'args' : ('\u3042', 0, 1, 'ouch'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000372 'object' : '\u3042', 'reason' : 'ouch',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000373 'start' : 0, 'end' : 1}),
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100374 (NaiveException, ('foo',),
375 {'args': ('foo',), 'x': 'foo'}),
376 (SlottedNaiveException, ('foo',),
377 {'args': ('foo',), 'x': 'foo'}),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000378 ]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000379 try:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200380 # More tests are in test_WindowsError
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000381 exceptionList.append(
382 (WindowsError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000383 {'args' : (1, 'strErrorStr'),
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200384 'strerror' : 'strErrorStr', 'winerror' : None,
Martin Panter5487c132015-10-26 11:05:42 +0000385 'errno' : 1,
386 'filename' : 'filenameStr', 'filename2' : None})
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000387 )
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000388 except NameError:
389 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000390
Guido van Rossumebe3e162007-05-17 18:20:34 +0000391 for exc, args, expected in exceptionList:
392 try:
393 e = exc(*args)
394 except:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000395 print("\nexc=%r, args=%r" % (exc, args), file=sys.stderr)
Guido van Rossumebe3e162007-05-17 18:20:34 +0000396 raise
397 else:
398 # Verify module name
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100399 if not type(e).__name__.endswith('NaiveException'):
400 self.assertEqual(type(e).__module__, 'builtins')
Guido van Rossumebe3e162007-05-17 18:20:34 +0000401 # Verify no ref leaks in Exc_str()
402 s = str(e)
403 for checkArgName in expected:
404 value = getattr(e, checkArgName)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000405 self.assertEqual(repr(value),
406 repr(expected[checkArgName]),
407 '%r.%s == %r, expected %r' % (
408 e, checkArgName,
409 value, expected[checkArgName]))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000410
Guido van Rossumebe3e162007-05-17 18:20:34 +0000411 # test for pickling support
Guido van Rossum99603b02007-07-20 00:22:32 +0000412 for p in [pickle]:
Guido van Rossumebe3e162007-05-17 18:20:34 +0000413 for protocol in range(p.HIGHEST_PROTOCOL + 1):
414 s = p.dumps(e, protocol)
415 new = p.loads(s)
416 for checkArgName in expected:
417 got = repr(getattr(new, checkArgName))
418 want = repr(expected[checkArgName])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000419 self.assertEqual(got, want,
420 'pickled "%r", attribute "%s' %
421 (e, checkArgName))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000422
Collin Winter828f04a2007-08-31 00:04:24 +0000423 def testWithTraceback(self):
424 try:
425 raise IndexError(4)
426 except:
427 tb = sys.exc_info()[2]
428
429 e = BaseException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000430 self.assertIsInstance(e, BaseException)
Collin Winter828f04a2007-08-31 00:04:24 +0000431 self.assertEqual(e.__traceback__, tb)
432
433 e = IndexError(5).with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000434 self.assertIsInstance(e, IndexError)
Collin Winter828f04a2007-08-31 00:04:24 +0000435 self.assertEqual(e.__traceback__, tb)
436
437 class MyException(Exception):
438 pass
439
440 e = MyException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000441 self.assertIsInstance(e, MyException)
Collin Winter828f04a2007-08-31 00:04:24 +0000442 self.assertEqual(e.__traceback__, tb)
443
444 def testInvalidTraceback(self):
445 try:
446 Exception().__traceback__ = 5
447 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000448 self.assertIn("__traceback__ must be a traceback", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000449 else:
450 self.fail("No exception raised")
451
Georg Brandlab6f2f62009-03-31 04:16:10 +0000452 def testInvalidAttrs(self):
453 self.assertRaises(TypeError, setattr, Exception(), '__cause__', 1)
454 self.assertRaises(TypeError, delattr, Exception(), '__cause__')
455 self.assertRaises(TypeError, setattr, Exception(), '__context__', 1)
456 self.assertRaises(TypeError, delattr, Exception(), '__context__')
457
Collin Winter828f04a2007-08-31 00:04:24 +0000458 def testNoneClearsTracebackAttr(self):
459 try:
460 raise IndexError(4)
461 except:
462 tb = sys.exc_info()[2]
463
464 e = Exception()
465 e.__traceback__ = tb
466 e.__traceback__ = None
467 self.assertEqual(e.__traceback__, None)
468
469 def testChainingAttrs(self):
470 e = Exception()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000471 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700472 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000473
474 e = TypeError()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000475 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700476 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000477
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200478 class MyException(OSError):
Collin Winter828f04a2007-08-31 00:04:24 +0000479 pass
480
481 e = MyException()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000482 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700483 self.assertIsNone(e.__cause__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000484
485 def testChainingDescriptors(self):
486 try:
487 raise Exception()
488 except Exception as exc:
489 e = exc
490
491 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700492 self.assertIsNone(e.__cause__)
493 self.assertFalse(e.__suppress_context__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000494
495 e.__context__ = NameError()
496 e.__cause__ = None
497 self.assertIsInstance(e.__context__, NameError)
498 self.assertIsNone(e.__cause__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700499 self.assertTrue(e.__suppress_context__)
500 e.__suppress_context__ = False
501 self.assertFalse(e.__suppress_context__)
Collin Winter828f04a2007-08-31 00:04:24 +0000502
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000503 def testKeywordArgs(self):
504 # test that builtin exception don't take keyword args,
505 # but user-defined subclasses can if they want
506 self.assertRaises(TypeError, BaseException, a=1)
507
508 class DerivedException(BaseException):
509 def __init__(self, fancy_arg):
510 BaseException.__init__(self)
511 self.fancy_arg = fancy_arg
512
513 x = DerivedException(fancy_arg=42)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000514 self.assertEqual(x.fancy_arg, 42)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000515
Brett Cannon31f59292011-02-21 19:29:56 +0000516 @no_tracing
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000517 def testInfiniteRecursion(self):
518 def f():
519 return f()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400520 self.assertRaises(RecursionError, f)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000521
522 def g():
523 try:
524 return g()
525 except ValueError:
526 return -1
Yury Selivanovf488fb42015-07-03 01:04:23 -0400527 self.assertRaises(RecursionError, g)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000528
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000529 def test_str(self):
530 # Make sure both instances and classes have a str representation.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000531 self.assertTrue(str(Exception))
532 self.assertTrue(str(Exception('a')))
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000533 self.assertTrue(str(Exception('a', 'b')))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000534
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000535 def testExceptionCleanupNames(self):
536 # Make sure the local variable bound to the exception instance by
537 # an "except" statement is only visible inside the except block.
Guido van Rossumb940e112007-01-10 16:19:56 +0000538 try:
539 raise Exception()
540 except Exception as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000541 self.assertTrue(e)
Guido van Rossumb940e112007-01-10 16:19:56 +0000542 del e
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000543 self.assertNotIn('e', locals())
Guido van Rossumb940e112007-01-10 16:19:56 +0000544
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000545 def testExceptionCleanupState(self):
546 # Make sure exception state is cleaned up as soon as the except
547 # block is left. See #2507
548
549 class MyException(Exception):
550 def __init__(self, obj):
551 self.obj = obj
552 class MyObj:
553 pass
554
555 def inner_raising_func():
556 # Create some references in exception value and traceback
557 local_ref = obj
558 raise MyException(obj)
559
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000560 # Qualified "except" with "as"
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000561 obj = MyObj()
562 wr = weakref.ref(obj)
563 try:
564 inner_raising_func()
565 except MyException as e:
566 pass
567 obj = None
568 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300569 self.assertIsNone(obj)
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000570
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000571 # Qualified "except" without "as"
572 obj = MyObj()
573 wr = weakref.ref(obj)
574 try:
575 inner_raising_func()
576 except MyException:
577 pass
578 obj = None
579 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300580 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000581
582 # Bare "except"
583 obj = MyObj()
584 wr = weakref.ref(obj)
585 try:
586 inner_raising_func()
587 except:
588 pass
589 obj = None
590 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300591 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000592
593 # "except" with premature block leave
594 obj = MyObj()
595 wr = weakref.ref(obj)
596 for i in [0]:
597 try:
598 inner_raising_func()
599 except:
600 break
601 obj = None
602 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300603 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000604
605 # "except" block raising another exception
606 obj = MyObj()
607 wr = weakref.ref(obj)
608 try:
609 try:
610 inner_raising_func()
611 except:
612 raise KeyError
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000613 except KeyError as e:
614 # We want to test that the except block above got rid of
615 # the exception raised in inner_raising_func(), but it
616 # also ends up in the __context__ of the KeyError, so we
617 # must clear the latter manually for our test to succeed.
618 e.__context__ = None
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000619 obj = None
620 obj = wr()
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800621 # guarantee no ref cycles on CPython (don't gc_collect)
622 if check_impl_detail(cpython=False):
623 gc_collect()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300624 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000625
626 # Some complicated construct
627 obj = MyObj()
628 wr = weakref.ref(obj)
629 try:
630 inner_raising_func()
631 except MyException:
632 try:
633 try:
634 raise
635 finally:
636 raise
637 except MyException:
638 pass
639 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800640 if check_impl_detail(cpython=False):
641 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000642 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300643 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000644
645 # Inside an exception-silencing "with" block
646 class Context:
647 def __enter__(self):
648 return self
649 def __exit__ (self, exc_type, exc_value, exc_tb):
650 return True
651 obj = MyObj()
652 wr = weakref.ref(obj)
653 with Context():
654 inner_raising_func()
655 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800656 if check_impl_detail(cpython=False):
657 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000658 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300659 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000660
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +0000661 def test_exception_target_in_nested_scope(self):
662 # issue 4617: This used to raise a SyntaxError
663 # "can not delete variable 'e' referenced in nested scope"
664 def print_error():
665 e
666 try:
667 something
668 except Exception as e:
669 print_error()
670 # implicit "del e" here
671
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000672 def test_generator_leaking(self):
673 # Test that generator exception state doesn't leak into the calling
674 # frame
675 def yield_raise():
676 try:
677 raise KeyError("caught")
678 except KeyError:
679 yield sys.exc_info()[0]
680 yield sys.exc_info()[0]
681 yield sys.exc_info()[0]
682 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000683 self.assertEqual(next(g), KeyError)
684 self.assertEqual(sys.exc_info()[0], None)
685 self.assertEqual(next(g), KeyError)
686 self.assertEqual(sys.exc_info()[0], None)
687 self.assertEqual(next(g), None)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000688
689 # Same test, but inside an exception handler
690 try:
691 raise TypeError("foo")
692 except TypeError:
693 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000694 self.assertEqual(next(g), KeyError)
695 self.assertEqual(sys.exc_info()[0], TypeError)
696 self.assertEqual(next(g), KeyError)
697 self.assertEqual(sys.exc_info()[0], TypeError)
698 self.assertEqual(next(g), TypeError)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000699 del g
Ezio Melottib3aedd42010-11-20 19:04:17 +0000700 self.assertEqual(sys.exc_info()[0], TypeError)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000701
Benjamin Peterson83195c32011-07-03 13:44:00 -0500702 def test_generator_leaking2(self):
703 # See issue 12475.
704 def g():
705 yield
706 try:
707 raise RuntimeError
708 except RuntimeError:
709 it = g()
710 next(it)
711 try:
712 next(it)
713 except StopIteration:
714 pass
715 self.assertEqual(sys.exc_info(), (None, None, None))
716
Antoine Pitrouc4c19b32015-03-18 22:22:46 +0100717 def test_generator_leaking3(self):
718 # See issue #23353. When gen.throw() is called, the caller's
719 # exception state should be save and restored.
720 def g():
721 try:
722 yield
723 except ZeroDivisionError:
724 yield sys.exc_info()[1]
725 it = g()
726 next(it)
727 try:
728 1/0
729 except ZeroDivisionError as e:
730 self.assertIs(sys.exc_info()[1], e)
731 gen_exc = it.throw(e)
732 self.assertIs(sys.exc_info()[1], e)
733 self.assertIs(gen_exc, e)
734 self.assertEqual(sys.exc_info(), (None, None, None))
735
736 def test_generator_leaking4(self):
737 # See issue #23353. When an exception is raised by a generator,
738 # the caller's exception state should still be restored.
739 def g():
740 try:
741 1/0
742 except ZeroDivisionError:
743 yield sys.exc_info()[0]
744 raise
745 it = g()
746 try:
747 raise TypeError
748 except TypeError:
749 # The caller's exception state (TypeError) is temporarily
750 # saved in the generator.
751 tp = next(it)
752 self.assertIs(tp, ZeroDivisionError)
753 try:
754 next(it)
755 # We can't check it immediately, but while next() returns
756 # with an exception, it shouldn't have restored the old
757 # exception state (TypeError).
758 except ZeroDivisionError as e:
759 self.assertIs(sys.exc_info()[1], e)
760 # We used to find TypeError here.
761 self.assertEqual(sys.exc_info(), (None, None, None))
762
Benjamin Petersonac913412011-07-03 16:25:11 -0500763 def test_generator_doesnt_retain_old_exc(self):
764 def g():
765 self.assertIsInstance(sys.exc_info()[1], RuntimeError)
766 yield
767 self.assertEqual(sys.exc_info(), (None, None, None))
768 it = g()
769 try:
770 raise RuntimeError
771 except RuntimeError:
772 next(it)
773 self.assertRaises(StopIteration, next, it)
774
Benjamin Petersonae5f2f42010-03-07 17:10:51 +0000775 def test_generator_finalizing_and_exc_info(self):
776 # See #7173
777 def simple_gen():
778 yield 1
779 def run_gen():
780 gen = simple_gen()
781 try:
782 raise RuntimeError
783 except RuntimeError:
784 return next(gen)
785 run_gen()
786 gc_collect()
787 self.assertEqual(sys.exc_info(), (None, None, None))
788
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200789 def _check_generator_cleanup_exc_state(self, testfunc):
790 # Issue #12791: exception state is cleaned up as soon as a generator
791 # is closed (reference cycles are broken).
792 class MyException(Exception):
793 def __init__(self, obj):
794 self.obj = obj
795 class MyObj:
796 pass
797
798 def raising_gen():
799 try:
800 raise MyException(obj)
801 except MyException:
802 yield
803
804 obj = MyObj()
805 wr = weakref.ref(obj)
806 g = raising_gen()
807 next(g)
808 testfunc(g)
809 g = obj = None
810 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300811 self.assertIsNone(obj)
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200812
813 def test_generator_throw_cleanup_exc_state(self):
814 def do_throw(g):
815 try:
816 g.throw(RuntimeError())
817 except RuntimeError:
818 pass
819 self._check_generator_cleanup_exc_state(do_throw)
820
821 def test_generator_close_cleanup_exc_state(self):
822 def do_close(g):
823 g.close()
824 self._check_generator_cleanup_exc_state(do_close)
825
826 def test_generator_del_cleanup_exc_state(self):
827 def do_del(g):
828 g = None
829 self._check_generator_cleanup_exc_state(do_del)
830
831 def test_generator_next_cleanup_exc_state(self):
832 def do_next(g):
833 try:
834 next(g)
835 except StopIteration:
836 pass
837 else:
838 self.fail("should have raised StopIteration")
839 self._check_generator_cleanup_exc_state(do_next)
840
841 def test_generator_send_cleanup_exc_state(self):
842 def do_send(g):
843 try:
844 g.send(None)
845 except StopIteration:
846 pass
847 else:
848 self.fail("should have raised StopIteration")
849 self._check_generator_cleanup_exc_state(do_send)
850
Benjamin Peterson27d63672008-06-15 20:09:12 +0000851 def test_3114(self):
852 # Bug #3114: in its destructor, MyObject retrieves a pointer to
853 # obsolete and/or deallocated objects.
Benjamin Peterson979f3112008-06-15 00:05:44 +0000854 class MyObject:
855 def __del__(self):
856 nonlocal e
857 e = sys.exc_info()
858 e = ()
859 try:
860 raise Exception(MyObject())
861 except:
862 pass
Ezio Melottib3aedd42010-11-20 19:04:17 +0000863 self.assertEqual(e, (None, None, None))
Benjamin Peterson979f3112008-06-15 00:05:44 +0000864
Benjamin Peterson24dfb052014-04-02 12:05:35 -0400865 def test_unicode_change_attributes(self):
Eric Smith0facd772010-02-24 15:42:29 +0000866 # See issue 7309. This was a crasher.
867
868 u = UnicodeEncodeError('baz', 'xxxxx', 1, 5, 'foo')
869 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: foo")
870 u.end = 2
871 self.assertEqual(str(u), "'baz' codec can't encode character '\\x78' in position 1: foo")
872 u.end = 5
873 u.reason = 0x345345345345345345
874 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: 965230951443685724997")
875 u.encoding = 4000
876 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1-4: 965230951443685724997")
877 u.start = 1000
878 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1000-4: 965230951443685724997")
879
880 u = UnicodeDecodeError('baz', b'xxxxx', 1, 5, 'foo')
881 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: foo")
882 u.end = 2
883 self.assertEqual(str(u), "'baz' codec can't decode byte 0x78 in position 1: foo")
884 u.end = 5
885 u.reason = 0x345345345345345345
886 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: 965230951443685724997")
887 u.encoding = 4000
888 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1-4: 965230951443685724997")
889 u.start = 1000
890 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1000-4: 965230951443685724997")
891
892 u = UnicodeTranslateError('xxxx', 1, 5, 'foo')
893 self.assertEqual(str(u), "can't translate characters in position 1-4: foo")
894 u.end = 2
895 self.assertEqual(str(u), "can't translate character '\\x78' in position 1: foo")
896 u.end = 5
897 u.reason = 0x345345345345345345
898 self.assertEqual(str(u), "can't translate characters in position 1-4: 965230951443685724997")
899 u.start = 1000
900 self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997")
Benjamin Peterson6e7740c2008-08-20 23:23:34 +0000901
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400902 def test_unicode_errors_no_object(self):
903 # See issue #21134.
Benjamin Petersone3311212014-04-02 15:51:38 -0400904 klasses = UnicodeEncodeError, UnicodeDecodeError, UnicodeTranslateError
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400905 for klass in klasses:
906 self.assertEqual(str(klass.__new__(klass)), "")
907
Brett Cannon31f59292011-02-21 19:29:56 +0000908 @no_tracing
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000909 def test_badisinstance(self):
910 # Bug #2542: if issubclass(e, MyException) raises an exception,
911 # it should be ignored
912 class Meta(type):
913 def __subclasscheck__(cls, subclass):
914 raise ValueError()
915 class MyException(Exception, metaclass=Meta):
916 pass
917
Martin Panter3263f682016-02-28 03:16:11 +0000918 with captured_stderr() as stderr:
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000919 try:
920 raise KeyError()
921 except MyException as e:
922 self.fail("exception should not be a MyException")
923 except KeyError:
924 pass
925 except:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000926 self.fail("Should have raised KeyError")
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000927 else:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000928 self.fail("Should have raised KeyError")
929
930 def g():
931 try:
932 return g()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400933 except RecursionError:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000934 return sys.exc_info()
935 e, v, tb = g()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300936 self.assertIsInstance(v, RecursionError, type(v))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000937 self.assertIn("maximum recursion depth exceeded", str(v))
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000938
xdegaye56d1f5c2017-10-26 15:09:06 +0200939 @cpython_only
940 def test_recursion_normalizing_exception(self):
941 # Issue #22898.
942 # Test that a RecursionError is raised when tstate->recursion_depth is
943 # equal to recursion_limit in PyErr_NormalizeException() and check
944 # that a ResourceWarning is printed.
945 # Prior to #22898, the recursivity of PyErr_NormalizeException() was
946 # controled by tstate->recursion_depth and a PyExc_RecursionErrorInst
947 # singleton was being used in that case, that held traceback data and
948 # locals indefinitely and would cause a segfault in _PyExc_Fini() upon
949 # finalization of these locals.
950 code = """if 1:
951 import sys
952 from _testcapi import get_recursion_depth
953
954 class MyException(Exception): pass
955
956 def setrecursionlimit(depth):
957 while 1:
958 try:
959 sys.setrecursionlimit(depth)
960 return depth
961 except RecursionError:
962 # sys.setrecursionlimit() raises a RecursionError if
963 # the new recursion limit is too low (issue #25274).
964 depth += 1
965
966 def recurse(cnt):
967 cnt -= 1
968 if cnt:
969 recurse(cnt)
970 else:
971 generator.throw(MyException)
972
973 def gen():
974 f = open(%a, mode='rb', buffering=0)
975 yield
976
977 generator = gen()
978 next(generator)
979 recursionlimit = sys.getrecursionlimit()
980 depth = get_recursion_depth()
981 try:
982 # Upon the last recursive invocation of recurse(),
983 # tstate->recursion_depth is equal to (recursion_limit - 1)
984 # and is equal to recursion_limit when _gen_throw() calls
985 # PyErr_NormalizeException().
986 recurse(setrecursionlimit(depth + 2) - depth - 1)
987 finally:
988 sys.setrecursionlimit(recursionlimit)
989 print('Done.')
990 """ % __file__
991 rc, out, err = script_helper.assert_python_failure("-Wd", "-c", code)
992 # Check that the program does not fail with SIGABRT.
993 self.assertEqual(rc, 1)
994 self.assertIn(b'RecursionError', err)
995 self.assertIn(b'ResourceWarning', err)
996 self.assertIn(b'Done.', out)
997
998 @cpython_only
999 def test_recursion_normalizing_infinite_exception(self):
1000 # Issue #30697. Test that a RecursionError is raised when
1001 # PyErr_NormalizeException() maximum recursion depth has been
1002 # exceeded.
1003 code = """if 1:
1004 import _testcapi
1005 try:
1006 raise _testcapi.RecursingInfinitelyError
1007 finally:
1008 print('Done.')
1009 """
1010 rc, out, err = script_helper.assert_python_failure("-c", code)
1011 self.assertEqual(rc, 1)
1012 self.assertIn(b'RecursionError: maximum recursion depth exceeded '
1013 b'while normalizing an exception', err)
1014 self.assertIn(b'Done.', out)
1015
1016 @cpython_only
1017 def test_recursion_normalizing_with_no_memory(self):
1018 # Issue #30697. Test that in the abort that occurs when there is no
1019 # memory left and the size of the Python frames stack is greater than
1020 # the size of the list of preallocated MemoryError instances, the
1021 # Fatal Python error message mentions MemoryError.
1022 code = """if 1:
1023 import _testcapi
1024 class C(): pass
1025 def recurse(cnt):
1026 cnt -= 1
1027 if cnt:
1028 recurse(cnt)
1029 else:
1030 _testcapi.set_nomemory(0)
1031 C()
1032 recurse(16)
1033 """
1034 with SuppressCrashReport():
1035 rc, out, err = script_helper.assert_python_failure("-c", code)
1036 self.assertIn(b'Fatal Python error: Cannot recover from '
1037 b'MemoryErrors while normalizing exceptions.', err)
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001038
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001039 @cpython_only
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001040 def test_MemoryError(self):
1041 # PyErr_NoMemory always raises the same exception instance.
1042 # Check that the traceback is not doubled.
1043 import traceback
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001044 from _testcapi import raise_memoryerror
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001045 def raiseMemError():
1046 try:
Benjamin Peterson0067bd62008-08-16 16:11:03 +00001047 raise_memoryerror()
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +00001048 except MemoryError as e:
1049 tb = e.__traceback__
1050 else:
1051 self.fail("Should have raises a MemoryError")
1052 return traceback.format_tb(tb)
1053
1054 tb1 = raiseMemError()
1055 tb2 = raiseMemError()
1056 self.assertEqual(tb1, tb2)
1057
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +00001058 @cpython_only
Georg Brandl1e28a272009-12-28 08:41:01 +00001059 def test_exception_with_doc(self):
1060 import _testcapi
1061 doc2 = "This is a test docstring."
1062 doc4 = "This is another test docstring."
1063
1064 self.assertRaises(SystemError, _testcapi.make_exception_with_doc,
1065 "error1")
1066
1067 # test basic usage of PyErr_NewException
1068 error1 = _testcapi.make_exception_with_doc("_testcapi.error1")
1069 self.assertIs(type(error1), type)
1070 self.assertTrue(issubclass(error1, Exception))
1071 self.assertIsNone(error1.__doc__)
1072
1073 # test with given docstring
1074 error2 = _testcapi.make_exception_with_doc("_testcapi.error2", doc2)
1075 self.assertEqual(error2.__doc__, doc2)
1076
1077 # test with explicit base (without docstring)
1078 error3 = _testcapi.make_exception_with_doc("_testcapi.error3",
1079 base=error2)
1080 self.assertTrue(issubclass(error3, error2))
1081
1082 # test with explicit base tuple
1083 class C(object):
1084 pass
1085 error4 = _testcapi.make_exception_with_doc("_testcapi.error4", doc4,
1086 (error3, C))
1087 self.assertTrue(issubclass(error4, error3))
1088 self.assertTrue(issubclass(error4, C))
1089 self.assertEqual(error4.__doc__, doc4)
1090
1091 # test with explicit dictionary
1092 error5 = _testcapi.make_exception_with_doc("_testcapi.error5", "",
1093 error4, {'a': 1})
1094 self.assertTrue(issubclass(error5, error4))
1095 self.assertEqual(error5.a, 1)
1096 self.assertEqual(error5.__doc__, "")
1097
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001098 @cpython_only
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001099 def test_memory_error_cleanup(self):
1100 # Issue #5437: preallocated MemoryError instances should not keep
1101 # traceback objects alive.
1102 from _testcapi import raise_memoryerror
1103 class C:
1104 pass
1105 wr = None
1106 def inner():
1107 nonlocal wr
1108 c = C()
1109 wr = weakref.ref(c)
1110 raise_memoryerror()
1111 # We cannot use assertRaises since it manually deletes the traceback
1112 try:
1113 inner()
1114 except MemoryError as e:
1115 self.assertNotEqual(wr(), None)
1116 else:
1117 self.fail("MemoryError not raised")
1118 self.assertEqual(wr(), None)
1119
Brett Cannon31f59292011-02-21 19:29:56 +00001120 @no_tracing
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001121 def test_recursion_error_cleanup(self):
1122 # Same test as above, but with "recursion exceeded" errors
1123 class C:
1124 pass
1125 wr = None
1126 def inner():
1127 nonlocal wr
1128 c = C()
1129 wr = weakref.ref(c)
1130 inner()
1131 # We cannot use assertRaises since it manually deletes the traceback
1132 try:
1133 inner()
Yury Selivanovf488fb42015-07-03 01:04:23 -04001134 except RecursionError as e:
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001135 self.assertNotEqual(wr(), None)
1136 else:
Yury Selivanovf488fb42015-07-03 01:04:23 -04001137 self.fail("RecursionError not raised")
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001138 self.assertEqual(wr(), None)
Georg Brandl1e28a272009-12-28 08:41:01 +00001139
Antoine Pitroua7622852011-09-01 21:37:43 +02001140 def test_errno_ENOTDIR(self):
1141 # Issue #12802: "not a directory" errors are ENOTDIR even on Windows
1142 with self.assertRaises(OSError) as cm:
1143 os.listdir(__file__)
1144 self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception)
1145
Martin Panter3263f682016-02-28 03:16:11 +00001146 def test_unraisable(self):
1147 # Issue #22836: PyErr_WriteUnraisable() should give sensible reports
1148 class BrokenDel:
1149 def __del__(self):
1150 exc = ValueError("del is broken")
1151 # The following line is included in the traceback report:
1152 raise exc
1153
Martin Panter3263f682016-02-28 03:16:11 +00001154 class BrokenExceptionDel:
1155 def __del__(self):
1156 exc = BrokenStrException()
1157 # The following line is included in the traceback report:
1158 raise exc
1159
Victor Stinner331bbe62017-02-09 23:49:50 +01001160 for test_class in (BrokenDel, BrokenExceptionDel):
Martin Panter3263f682016-02-28 03:16:11 +00001161 with self.subTest(test_class):
1162 obj = test_class()
1163 with captured_stderr() as stderr:
1164 del obj
1165 report = stderr.getvalue()
1166 self.assertIn("Exception ignored", report)
Victor Stinner331bbe62017-02-09 23:49:50 +01001167 self.assertIn(test_class.__del__.__qualname__, report)
Martin Panter3263f682016-02-28 03:16:11 +00001168 self.assertIn("test_exceptions.py", report)
1169 self.assertIn("raise exc", report)
1170 if test_class is BrokenExceptionDel:
1171 self.assertIn("BrokenStrException", report)
1172 self.assertIn("<exception str() failed>", report)
1173 else:
1174 self.assertIn("ValueError", report)
1175 self.assertIn("del is broken", report)
1176 self.assertTrue(report.endswith("\n"))
1177
1178 def test_unhandled(self):
1179 # Check for sensible reporting of unhandled exceptions
1180 for exc_type in (ValueError, BrokenStrException):
1181 with self.subTest(exc_type):
1182 try:
1183 exc = exc_type("test message")
1184 # The following line is included in the traceback report:
1185 raise exc
1186 except exc_type:
1187 with captured_stderr() as stderr:
1188 sys.__excepthook__(*sys.exc_info())
1189 report = stderr.getvalue()
1190 self.assertIn("test_exceptions.py", report)
1191 self.assertIn("raise exc", report)
1192 self.assertIn(exc_type.__name__, report)
1193 if exc_type is BrokenStrException:
1194 self.assertIn("<exception str() failed>", report)
1195 else:
1196 self.assertIn("test message", report)
1197 self.assertTrue(report.endswith("\n"))
1198
xdegaye66caacf2017-10-23 18:08:41 +02001199 @cpython_only
1200 def test_memory_error_in_PyErr_PrintEx(self):
1201 code = """if 1:
1202 import _testcapi
1203 class C(): pass
1204 _testcapi.set_nomemory(0, %d)
1205 C()
1206 """
1207
1208 # Issue #30817: Abort in PyErr_PrintEx() when no memory.
1209 # Span a large range of tests as the CPython code always evolves with
1210 # changes that add or remove memory allocations.
1211 for i in range(1, 20):
1212 rc, out, err = script_helper.assert_python_failure("-c", code % i)
1213 self.assertIn(rc, (1, 120))
1214 self.assertIn(b'MemoryError', err)
1215
Mark Shannonae3087c2017-10-22 22:41:51 +01001216 def test_yield_in_nested_try_excepts(self):
1217 #Issue #25612
1218 class MainError(Exception):
1219 pass
1220
1221 class SubError(Exception):
1222 pass
1223
1224 def main():
1225 try:
1226 raise MainError()
1227 except MainError:
1228 try:
1229 yield
1230 except SubError:
1231 pass
1232 raise
1233
1234 coro = main()
1235 coro.send(None)
1236 with self.assertRaises(MainError):
1237 coro.throw(SubError())
1238
1239 def test_generator_doesnt_retain_old_exc2(self):
1240 #Issue 28884#msg282532
1241 def g():
1242 try:
1243 raise ValueError
1244 except ValueError:
1245 yield 1
1246 self.assertEqual(sys.exc_info(), (None, None, None))
1247 yield 2
1248
1249 gen = g()
1250
1251 try:
1252 raise IndexError
1253 except IndexError:
1254 self.assertEqual(next(gen), 1)
1255 self.assertEqual(next(gen), 2)
1256
1257 def test_raise_in_generator(self):
1258 #Issue 25612#msg304117
1259 def g():
1260 yield 1
1261 raise
1262 yield 2
1263
1264 with self.assertRaises(ZeroDivisionError):
1265 i = g()
1266 try:
1267 1/0
1268 except:
1269 next(i)
1270 next(i)
1271
Antoine Pitroua7622852011-09-01 21:37:43 +02001272
Brett Cannon79ec55e2012-04-12 20:24:54 -04001273class ImportErrorTests(unittest.TestCase):
1274
1275 def test_attributes(self):
1276 # Setting 'name' and 'path' should not be a problem.
1277 exc = ImportError('test')
1278 self.assertIsNone(exc.name)
1279 self.assertIsNone(exc.path)
1280
1281 exc = ImportError('test', name='somemodule')
1282 self.assertEqual(exc.name, 'somemodule')
1283 self.assertIsNone(exc.path)
1284
1285 exc = ImportError('test', path='somepath')
1286 self.assertEqual(exc.path, 'somepath')
1287 self.assertIsNone(exc.name)
1288
1289 exc = ImportError('test', path='somepath', name='somename')
1290 self.assertEqual(exc.name, 'somename')
1291 self.assertEqual(exc.path, 'somepath')
1292
Michael Seifert64c8f702017-04-09 09:47:12 +02001293 msg = "'invalid' is an invalid keyword argument for ImportError"
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001294 with self.assertRaisesRegex(TypeError, msg):
1295 ImportError('test', invalid='keyword')
1296
1297 with self.assertRaisesRegex(TypeError, msg):
1298 ImportError('test', name='name', invalid='keyword')
1299
1300 with self.assertRaisesRegex(TypeError, msg):
1301 ImportError('test', path='path', invalid='keyword')
1302
1303 with self.assertRaisesRegex(TypeError, msg):
1304 ImportError(invalid='keyword')
1305
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001306 with self.assertRaisesRegex(TypeError, msg):
1307 ImportError('test', invalid='keyword', another=True)
1308
Serhiy Storchakae9e44482016-09-28 07:53:32 +03001309 def test_reset_attributes(self):
1310 exc = ImportError('test', name='name', path='path')
1311 self.assertEqual(exc.args, ('test',))
1312 self.assertEqual(exc.msg, 'test')
1313 self.assertEqual(exc.name, 'name')
1314 self.assertEqual(exc.path, 'path')
1315
1316 # Reset not specified attributes
1317 exc.__init__()
1318 self.assertEqual(exc.args, ())
1319 self.assertEqual(exc.msg, None)
1320 self.assertEqual(exc.name, None)
1321 self.assertEqual(exc.path, None)
1322
Brett Cannon07c6e712012-08-24 13:05:09 -04001323 def test_non_str_argument(self):
1324 # Issue #15778
Nadeem Vawda6d708702012-10-14 01:42:32 +02001325 with check_warnings(('', BytesWarning), quiet=True):
1326 arg = b'abc'
1327 exc = ImportError(arg)
1328 self.assertEqual(str(arg), str(exc))
Brett Cannon79ec55e2012-04-12 20:24:54 -04001329
Serhiy Storchakab7853962017-04-08 09:55:07 +03001330 def test_copy_pickle(self):
1331 for kwargs in (dict(),
1332 dict(name='somename'),
1333 dict(path='somepath'),
1334 dict(name='somename', path='somepath')):
1335 orig = ImportError('test', **kwargs)
1336 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1337 exc = pickle.loads(pickle.dumps(orig, proto))
1338 self.assertEqual(exc.args, ('test',))
1339 self.assertEqual(exc.msg, 'test')
1340 self.assertEqual(exc.name, orig.name)
1341 self.assertEqual(exc.path, orig.path)
1342 for c in copy.copy, copy.deepcopy:
1343 exc = c(orig)
1344 self.assertEqual(exc.args, ('test',))
1345 self.assertEqual(exc.msg, 'test')
1346 self.assertEqual(exc.name, orig.name)
1347 self.assertEqual(exc.path, orig.path)
1348
Brett Cannon79ec55e2012-04-12 20:24:54 -04001349
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001350if __name__ == '__main__':
Guido van Rossumb8142c32007-05-08 17:49:10 +00001351 unittest.main()