blob: 3378ceb701c044262eb9c9211eb45d2dcdda09f1 [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,
Victor Stinnerd223fa62015-04-02 14:17:38 +020013 no_tracing, unlink, import_module)
Guido van Rossum83b120d2001-08-23 03:23:03 +000014
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
Serhiy Storchaka65fd0592014-01-21 22:26:52 +0200159 def testSyntaxErrorOffset(self):
160 def check(src, lineno, offset):
161 with self.assertRaises(SyntaxError) as cm:
162 compile(src, '<fragment>', 'exec')
163 self.assertEqual(cm.exception.lineno, lineno)
164 self.assertEqual(cm.exception.offset, offset)
165
166 check('def fact(x):\n\treturn x!\n', 2, 10)
167 check('1 +\n', 1, 4)
168 check('def spam():\n print(1)\n print(2)', 3, 10)
169 check('Python = "Python" +', 1, 20)
170 check('Python = "\u1e54\xfd\u0163\u0125\xf2\xf1" +', 1, 20)
171
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +0000172 @cpython_only
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000173 def testSettingException(self):
174 # test that setting an exception at the C level works even if the
175 # exception object can't be constructed.
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000176
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000177 class BadException(Exception):
178 def __init__(self_):
Collin Winter828f04a2007-08-31 00:04:24 +0000179 raise RuntimeError("can't instantiate BadException")
Finn Bockaa3dc452001-12-08 10:15:48 +0000180
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000181 class InvalidException:
182 pass
Thomas Wouters303de6a2006-04-20 22:42:37 +0000183
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000184 def test_capi1():
185 import _testcapi
186 try:
187 _testcapi.raise_exception(BadException, 1)
Guido van Rossumb940e112007-01-10 16:19:56 +0000188 except TypeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000189 exc, err, tb = sys.exc_info()
190 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000191 self.assertEqual(co.co_name, "test_capi1")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000192 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000193 else:
194 self.fail("Expected exception")
Jeremy Hyltonede049b2001-09-26 20:01:13 +0000195
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000196 def test_capi2():
197 import _testcapi
198 try:
199 _testcapi.raise_exception(BadException, 0)
Guido van Rossumb940e112007-01-10 16:19:56 +0000200 except RuntimeError as err:
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000201 exc, err, tb = sys.exc_info()
202 co = tb.tb_frame.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000203 self.assertEqual(co.co_name, "__init__")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000204 self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000205 co2 = tb.tb_frame.f_back.f_code
Ezio Melottib3aedd42010-11-20 19:04:17 +0000206 self.assertEqual(co2.co_name, "test_capi2")
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000207 else:
208 self.fail("Expected exception")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000209
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000210 def test_capi3():
211 import _testcapi
212 self.assertRaises(SystemError, _testcapi.raise_exception,
213 InvalidException, 1)
214
215 if not sys.platform.startswith('java'):
216 test_capi1()
217 test_capi2()
218 test_capi3()
219
Thomas Wouters89f507f2006-12-13 04:49:30 +0000220 def test_WindowsError(self):
221 try:
222 WindowsError
223 except NameError:
224 pass
225 else:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200226 self.assertIs(WindowsError, OSError)
227 self.assertEqual(str(OSError(1001)), "1001")
228 self.assertEqual(str(OSError(1001, "message")),
229 "[Errno 1001] message")
230 # POSIX errno (9 aka EBADF) is untranslated
231 w = OSError(9, 'foo', 'bar')
232 self.assertEqual(w.errno, 9)
233 self.assertEqual(w.winerror, None)
234 self.assertEqual(str(w), "[Errno 9] foo: 'bar'")
235 # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2)
236 w = OSError(0, 'foo', 'bar', 3)
237 self.assertEqual(w.errno, 2)
238 self.assertEqual(w.winerror, 3)
239 self.assertEqual(w.strerror, 'foo')
240 self.assertEqual(w.filename, 'bar')
Martin Panter5487c132015-10-26 11:05:42 +0000241 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100242 self.assertEqual(str(w), "[WinError 3] foo: 'bar'")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200243 # Unknown win error becomes EINVAL (22)
244 w = OSError(0, 'foo', None, 1001)
245 self.assertEqual(w.errno, 22)
246 self.assertEqual(w.winerror, 1001)
247 self.assertEqual(w.strerror, 'foo')
248 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000249 self.assertEqual(w.filename2, None)
Richard Oudkerk30147712012-08-28 19:33:26 +0100250 self.assertEqual(str(w), "[WinError 1001] foo")
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200251 # Non-numeric "errno"
252 w = OSError('bar', 'foo')
253 self.assertEqual(w.errno, 'bar')
254 self.assertEqual(w.winerror, None)
255 self.assertEqual(w.strerror, 'foo')
256 self.assertEqual(w.filename, None)
Martin Panter5487c132015-10-26 11:05:42 +0000257 self.assertEqual(w.filename2, None)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000258
Victor Stinnerd223fa62015-04-02 14:17:38 +0200259 @unittest.skipUnless(sys.platform == 'win32',
260 'test specific to Windows')
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300261 def test_windows_message(self):
262 """Should fill in unknown error code in Windows error message"""
Victor Stinnerd223fa62015-04-02 14:17:38 +0200263 ctypes = import_module('ctypes')
264 # this error code has no message, Python formats it as hexadecimal
265 code = 3765269347
266 with self.assertRaisesRegex(OSError, 'Windows Error 0x%x' % code):
267 ctypes.pythonapi.PyErr_SetFromWindowsErr(code)
Serhiy Storchakaf41f8f92015-04-02 09:47:27 +0300268
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000269 def testAttributes(self):
270 # test that exception attributes are happy
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000271
272 exceptionList = [
Guido van Rossumebe3e162007-05-17 18:20:34 +0000273 (BaseException, (), {'args' : ()}),
274 (BaseException, (1, ), {'args' : (1,)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000275 (BaseException, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000276 {'args' : ('foo',)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000277 (BaseException, ('foo', 1),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000278 {'args' : ('foo', 1)}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000279 (SystemExit, ('foo',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000280 {'args' : ('foo',), 'code' : 'foo'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200281 (OSError, ('foo',),
Martin Panter5487c132015-10-26 11:05:42 +0000282 {'args' : ('foo',), 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000283 'errno' : None, 'strerror' : None}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200284 (OSError, ('foo', 'bar'),
Martin Panter5487c132015-10-26 11:05:42 +0000285 {'args' : ('foo', 'bar'),
286 'filename' : None, 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287 'errno' : 'foo', 'strerror' : 'bar'}),
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200288 (OSError, ('foo', 'bar', 'baz'),
Martin Panter5487c132015-10-26 11:05:42 +0000289 {'args' : ('foo', 'bar'),
290 'filename' : 'baz', 'filename2' : None,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000291 'errno' : 'foo', 'strerror' : 'bar'}),
Larry Hastingsb0827312014-02-09 22:05:19 -0800292 (OSError, ('foo', 'bar', 'baz', None, 'quux'),
293 {'args' : ('foo', 'bar'), 'filename' : 'baz', 'filename2': 'quux'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200294 (OSError, ('errnoStr', 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000295 {'args' : ('errnoStr', 'strErrorStr'),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000296 'strerror' : 'strErrorStr', 'errno' : 'errnoStr',
297 'filename' : 'filenameStr'}),
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200298 (OSError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000299 {'args' : (1, 'strErrorStr'), 'errno' : 1,
Martin Panter5487c132015-10-26 11:05:42 +0000300 'strerror' : 'strErrorStr',
301 'filename' : 'filenameStr', 'filename2' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000302 (SyntaxError, (), {'msg' : None, 'text' : None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000303 'filename' : None, 'lineno' : None, 'offset' : None,
304 'print_file_and_line' : None}),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000305 (SyntaxError, ('msgStr',),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000306 {'args' : ('msgStr',), 'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000307 'print_file_and_line' : None, 'msg' : 'msgStr',
308 'filename' : None, 'lineno' : None, 'offset' : None}),
309 (SyntaxError, ('msgStr', ('filenameStr', 'linenoStr', 'offsetStr',
310 'textStr')),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000311 {'offset' : 'offsetStr', 'text' : 'textStr',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000312 'args' : ('msgStr', ('filenameStr', 'linenoStr',
313 'offsetStr', 'textStr')),
314 'print_file_and_line' : None, 'msg' : 'msgStr',
315 'filename' : 'filenameStr', 'lineno' : 'linenoStr'}),
316 (SyntaxError, ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
317 'textStr', 'print_file_and_lineStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000318 {'text' : None,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000319 'args' : ('msgStr', 'filenameStr', 'linenoStr', 'offsetStr',
320 'textStr', 'print_file_and_lineStr'),
321 'print_file_and_line' : None, 'msg' : 'msgStr',
322 'filename' : None, 'lineno' : None, 'offset' : None}),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000323 (UnicodeError, (), {'args' : (),}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000324 (UnicodeEncodeError, ('ascii', 'a', 0, 1,
325 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000326 {'args' : ('ascii', 'a', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000327 'ordinal not in range'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000328 'encoding' : 'ascii', 'object' : 'a',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000329 'start' : 0, 'reason' : 'ordinal not in range'}),
Guido van Rossum254348e2007-11-21 19:29:53 +0000330 (UnicodeDecodeError, ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000331 'ordinal not in range'),
Guido van Rossum254348e2007-11-21 19:29:53 +0000332 {'args' : ('ascii', bytearray(b'\xff'), 0, 1,
Guido van Rossum98297ee2007-11-06 21:34:58 +0000333 'ordinal not in range'),
334 'encoding' : 'ascii', 'object' : b'\xff',
335 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000336 (UnicodeDecodeError, ('ascii', b'\xff', 0, 1,
337 'ordinal not in range'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000338 {'args' : ('ascii', b'\xff', 0, 1,
Thomas Wouters89f507f2006-12-13 04:49:30 +0000339 'ordinal not in range'),
Guido van Rossumb8142c32007-05-08 17:49:10 +0000340 'encoding' : 'ascii', 'object' : b'\xff',
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341 'start' : 0, 'reason' : 'ordinal not in range'}),
Walter Dörwaldeceb0fb2007-05-24 17:49:56 +0000342 (UnicodeTranslateError, ("\u3042", 0, 1, "ouch"),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000343 {'args' : ('\u3042', 0, 1, 'ouch'),
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000344 'object' : '\u3042', 'reason' : 'ouch',
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000345 'start' : 0, 'end' : 1}),
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100346 (NaiveException, ('foo',),
347 {'args': ('foo',), 'x': 'foo'}),
348 (SlottedNaiveException, ('foo',),
349 {'args': ('foo',), 'x': 'foo'}),
Thomas Wouters477c8d52006-05-27 19:21:47 +0000350 ]
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000351 try:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200352 # More tests are in test_WindowsError
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000353 exceptionList.append(
354 (WindowsError, (1, 'strErrorStr', 'filenameStr'),
Guido van Rossumebe3e162007-05-17 18:20:34 +0000355 {'args' : (1, 'strErrorStr'),
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200356 'strerror' : 'strErrorStr', 'winerror' : None,
Martin Panter5487c132015-10-26 11:05:42 +0000357 'errno' : 1,
358 'filename' : 'filenameStr', 'filename2' : None})
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000359 )
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000360 except NameError:
361 pass
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000362
Guido van Rossumebe3e162007-05-17 18:20:34 +0000363 for exc, args, expected in exceptionList:
364 try:
365 e = exc(*args)
366 except:
Guido van Rossum98297ee2007-11-06 21:34:58 +0000367 print("\nexc=%r, args=%r" % (exc, args), file=sys.stderr)
Guido van Rossumebe3e162007-05-17 18:20:34 +0000368 raise
369 else:
370 # Verify module name
Richard Oudkerk5562d9d2012-07-28 17:45:28 +0100371 if not type(e).__name__.endswith('NaiveException'):
372 self.assertEqual(type(e).__module__, 'builtins')
Guido van Rossumebe3e162007-05-17 18:20:34 +0000373 # Verify no ref leaks in Exc_str()
374 s = str(e)
375 for checkArgName in expected:
376 value = getattr(e, checkArgName)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000377 self.assertEqual(repr(value),
378 repr(expected[checkArgName]),
379 '%r.%s == %r, expected %r' % (
380 e, checkArgName,
381 value, expected[checkArgName]))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000382
Guido van Rossumebe3e162007-05-17 18:20:34 +0000383 # test for pickling support
Guido van Rossum99603b02007-07-20 00:22:32 +0000384 for p in [pickle]:
Guido van Rossumebe3e162007-05-17 18:20:34 +0000385 for protocol in range(p.HIGHEST_PROTOCOL + 1):
386 s = p.dumps(e, protocol)
387 new = p.loads(s)
388 for checkArgName in expected:
389 got = repr(getattr(new, checkArgName))
390 want = repr(expected[checkArgName])
Ezio Melottib3aedd42010-11-20 19:04:17 +0000391 self.assertEqual(got, want,
392 'pickled "%r", attribute "%s' %
393 (e, checkArgName))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000394
Collin Winter828f04a2007-08-31 00:04:24 +0000395 def testWithTraceback(self):
396 try:
397 raise IndexError(4)
398 except:
399 tb = sys.exc_info()[2]
400
401 e = BaseException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000402 self.assertIsInstance(e, BaseException)
Collin Winter828f04a2007-08-31 00:04:24 +0000403 self.assertEqual(e.__traceback__, tb)
404
405 e = IndexError(5).with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000406 self.assertIsInstance(e, IndexError)
Collin Winter828f04a2007-08-31 00:04:24 +0000407 self.assertEqual(e.__traceback__, tb)
408
409 class MyException(Exception):
410 pass
411
412 e = MyException().with_traceback(tb)
Ezio Melottie9615932010-01-24 19:26:24 +0000413 self.assertIsInstance(e, MyException)
Collin Winter828f04a2007-08-31 00:04:24 +0000414 self.assertEqual(e.__traceback__, tb)
415
416 def testInvalidTraceback(self):
417 try:
418 Exception().__traceback__ = 5
419 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000420 self.assertIn("__traceback__ must be a traceback", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000421 else:
422 self.fail("No exception raised")
423
Georg Brandlab6f2f62009-03-31 04:16:10 +0000424 def testInvalidAttrs(self):
425 self.assertRaises(TypeError, setattr, Exception(), '__cause__', 1)
426 self.assertRaises(TypeError, delattr, Exception(), '__cause__')
427 self.assertRaises(TypeError, setattr, Exception(), '__context__', 1)
428 self.assertRaises(TypeError, delattr, Exception(), '__context__')
429
Collin Winter828f04a2007-08-31 00:04:24 +0000430 def testNoneClearsTracebackAttr(self):
431 try:
432 raise IndexError(4)
433 except:
434 tb = sys.exc_info()[2]
435
436 e = Exception()
437 e.__traceback__ = tb
438 e.__traceback__ = None
439 self.assertEqual(e.__traceback__, None)
440
441 def testChainingAttrs(self):
442 e = Exception()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000443 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700444 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000445
446 e = TypeError()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000447 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700448 self.assertIsNone(e.__cause__)
Collin Winter828f04a2007-08-31 00:04:24 +0000449
Andrew Svetlov3438fa42012-12-17 23:35:18 +0200450 class MyException(OSError):
Collin Winter828f04a2007-08-31 00:04:24 +0000451 pass
452
453 e = MyException()
Nick Coghlanab7bf212012-02-26 17:49:52 +1000454 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700455 self.assertIsNone(e.__cause__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000456
457 def testChainingDescriptors(self):
458 try:
459 raise Exception()
460 except Exception as exc:
461 e = exc
462
463 self.assertIsNone(e.__context__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700464 self.assertIsNone(e.__cause__)
465 self.assertFalse(e.__suppress_context__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000466
467 e.__context__ = NameError()
468 e.__cause__ = None
469 self.assertIsInstance(e.__context__, NameError)
470 self.assertIsNone(e.__cause__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700471 self.assertTrue(e.__suppress_context__)
472 e.__suppress_context__ = False
473 self.assertFalse(e.__suppress_context__)
Collin Winter828f04a2007-08-31 00:04:24 +0000474
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000475 def testKeywordArgs(self):
476 # test that builtin exception don't take keyword args,
477 # but user-defined subclasses can if they want
478 self.assertRaises(TypeError, BaseException, a=1)
479
480 class DerivedException(BaseException):
481 def __init__(self, fancy_arg):
482 BaseException.__init__(self)
483 self.fancy_arg = fancy_arg
484
485 x = DerivedException(fancy_arg=42)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000486 self.assertEqual(x.fancy_arg, 42)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000487
Brett Cannon31f59292011-02-21 19:29:56 +0000488 @no_tracing
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000489 def testInfiniteRecursion(self):
490 def f():
491 return f()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400492 self.assertRaises(RecursionError, f)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000493
494 def g():
495 try:
496 return g()
497 except ValueError:
498 return -1
Yury Selivanovf488fb42015-07-03 01:04:23 -0400499 self.assertRaises(RecursionError, g)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000500
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000501 def test_str(self):
502 # Make sure both instances and classes have a str representation.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000503 self.assertTrue(str(Exception))
504 self.assertTrue(str(Exception('a')))
Ezio Melotti2f5a78c2009-12-24 22:54:06 +0000505 self.assertTrue(str(Exception('a', 'b')))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000506
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000507 def testExceptionCleanupNames(self):
508 # Make sure the local variable bound to the exception instance by
509 # an "except" statement is only visible inside the except block.
Guido van Rossumb940e112007-01-10 16:19:56 +0000510 try:
511 raise Exception()
512 except Exception as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000513 self.assertTrue(e)
Guido van Rossumb940e112007-01-10 16:19:56 +0000514 del e
Ezio Melottib58e0bd2010-01-23 15:40:09 +0000515 self.assertNotIn('e', locals())
Guido van Rossumb940e112007-01-10 16:19:56 +0000516
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000517 def testExceptionCleanupState(self):
518 # Make sure exception state is cleaned up as soon as the except
519 # block is left. See #2507
520
521 class MyException(Exception):
522 def __init__(self, obj):
523 self.obj = obj
524 class MyObj:
525 pass
526
527 def inner_raising_func():
528 # Create some references in exception value and traceback
529 local_ref = obj
530 raise MyException(obj)
531
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000532 # Qualified "except" with "as"
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000533 obj = MyObj()
534 wr = weakref.ref(obj)
535 try:
536 inner_raising_func()
537 except MyException as e:
538 pass
539 obj = None
540 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300541 self.assertIsNone(obj)
Barry Warsaw8d109cb2008-05-08 04:26:35 +0000542
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000543 # Qualified "except" without "as"
544 obj = MyObj()
545 wr = weakref.ref(obj)
546 try:
547 inner_raising_func()
548 except MyException:
549 pass
550 obj = None
551 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300552 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000553
554 # Bare "except"
555 obj = MyObj()
556 wr = weakref.ref(obj)
557 try:
558 inner_raising_func()
559 except:
560 pass
561 obj = None
562 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300563 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000564
565 # "except" with premature block leave
566 obj = MyObj()
567 wr = weakref.ref(obj)
568 for i in [0]:
569 try:
570 inner_raising_func()
571 except:
572 break
573 obj = None
574 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300575 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000576
577 # "except" block raising another exception
578 obj = MyObj()
579 wr = weakref.ref(obj)
580 try:
581 try:
582 inner_raising_func()
583 except:
584 raise KeyError
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000585 except KeyError as e:
586 # We want to test that the except block above got rid of
587 # the exception raised in inner_raising_func(), but it
588 # also ends up in the __context__ of the KeyError, so we
589 # must clear the latter manually for our test to succeed.
590 e.__context__ = None
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000591 obj = None
592 obj = wr()
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800593 # guarantee no ref cycles on CPython (don't gc_collect)
594 if check_impl_detail(cpython=False):
595 gc_collect()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300596 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000597
598 # Some complicated construct
599 obj = MyObj()
600 wr = weakref.ref(obj)
601 try:
602 inner_raising_func()
603 except MyException:
604 try:
605 try:
606 raise
607 finally:
608 raise
609 except MyException:
610 pass
611 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800612 if check_impl_detail(cpython=False):
613 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000614 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300615 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000616
617 # Inside an exception-silencing "with" block
618 class Context:
619 def __enter__(self):
620 return self
621 def __exit__ (self, exc_type, exc_value, exc_tb):
622 return True
623 obj = MyObj()
624 wr = weakref.ref(obj)
625 with Context():
626 inner_raising_func()
627 obj = None
Philip Jenveyb37ac8e2012-11-14 14:37:24 -0800628 if check_impl_detail(cpython=False):
629 gc_collect()
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000630 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300631 self.assertIsNone(obj)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000632
Amaury Forgeot d'Arcba117ef2010-09-10 21:39:53 +0000633 def test_exception_target_in_nested_scope(self):
634 # issue 4617: This used to raise a SyntaxError
635 # "can not delete variable 'e' referenced in nested scope"
636 def print_error():
637 e
638 try:
639 something
640 except Exception as e:
641 print_error()
642 # implicit "del e" here
643
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000644 def test_generator_leaking(self):
645 # Test that generator exception state doesn't leak into the calling
646 # frame
647 def yield_raise():
648 try:
649 raise KeyError("caught")
650 except KeyError:
651 yield sys.exc_info()[0]
652 yield sys.exc_info()[0]
653 yield sys.exc_info()[0]
654 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000655 self.assertEqual(next(g), KeyError)
656 self.assertEqual(sys.exc_info()[0], None)
657 self.assertEqual(next(g), KeyError)
658 self.assertEqual(sys.exc_info()[0], None)
659 self.assertEqual(next(g), None)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000660
661 # Same test, but inside an exception handler
662 try:
663 raise TypeError("foo")
664 except TypeError:
665 g = yield_raise()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000666 self.assertEqual(next(g), KeyError)
667 self.assertEqual(sys.exc_info()[0], TypeError)
668 self.assertEqual(next(g), KeyError)
669 self.assertEqual(sys.exc_info()[0], TypeError)
670 self.assertEqual(next(g), TypeError)
Benjamin Petersoneec3d712008-06-11 15:59:43 +0000671 del g
Ezio Melottib3aedd42010-11-20 19:04:17 +0000672 self.assertEqual(sys.exc_info()[0], TypeError)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000673
Benjamin Peterson83195c32011-07-03 13:44:00 -0500674 def test_generator_leaking2(self):
675 # See issue 12475.
676 def g():
677 yield
678 try:
679 raise RuntimeError
680 except RuntimeError:
681 it = g()
682 next(it)
683 try:
684 next(it)
685 except StopIteration:
686 pass
687 self.assertEqual(sys.exc_info(), (None, None, None))
688
Antoine Pitrouc4c19b32015-03-18 22:22:46 +0100689 def test_generator_leaking3(self):
690 # See issue #23353. When gen.throw() is called, the caller's
691 # exception state should be save and restored.
692 def g():
693 try:
694 yield
695 except ZeroDivisionError:
696 yield sys.exc_info()[1]
697 it = g()
698 next(it)
699 try:
700 1/0
701 except ZeroDivisionError as e:
702 self.assertIs(sys.exc_info()[1], e)
703 gen_exc = it.throw(e)
704 self.assertIs(sys.exc_info()[1], e)
705 self.assertIs(gen_exc, e)
706 self.assertEqual(sys.exc_info(), (None, None, None))
707
708 def test_generator_leaking4(self):
709 # See issue #23353. When an exception is raised by a generator,
710 # the caller's exception state should still be restored.
711 def g():
712 try:
713 1/0
714 except ZeroDivisionError:
715 yield sys.exc_info()[0]
716 raise
717 it = g()
718 try:
719 raise TypeError
720 except TypeError:
721 # The caller's exception state (TypeError) is temporarily
722 # saved in the generator.
723 tp = next(it)
724 self.assertIs(tp, ZeroDivisionError)
725 try:
726 next(it)
727 # We can't check it immediately, but while next() returns
728 # with an exception, it shouldn't have restored the old
729 # exception state (TypeError).
730 except ZeroDivisionError as e:
731 self.assertIs(sys.exc_info()[1], e)
732 # We used to find TypeError here.
733 self.assertEqual(sys.exc_info(), (None, None, None))
734
Benjamin Petersonac913412011-07-03 16:25:11 -0500735 def test_generator_doesnt_retain_old_exc(self):
736 def g():
737 self.assertIsInstance(sys.exc_info()[1], RuntimeError)
738 yield
739 self.assertEqual(sys.exc_info(), (None, None, None))
740 it = g()
741 try:
742 raise RuntimeError
743 except RuntimeError:
744 next(it)
745 self.assertRaises(StopIteration, next, it)
746
Benjamin Petersonae5f2f42010-03-07 17:10:51 +0000747 def test_generator_finalizing_and_exc_info(self):
748 # See #7173
749 def simple_gen():
750 yield 1
751 def run_gen():
752 gen = simple_gen()
753 try:
754 raise RuntimeError
755 except RuntimeError:
756 return next(gen)
757 run_gen()
758 gc_collect()
759 self.assertEqual(sys.exc_info(), (None, None, None))
760
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200761 def _check_generator_cleanup_exc_state(self, testfunc):
762 # Issue #12791: exception state is cleaned up as soon as a generator
763 # is closed (reference cycles are broken).
764 class MyException(Exception):
765 def __init__(self, obj):
766 self.obj = obj
767 class MyObj:
768 pass
769
770 def raising_gen():
771 try:
772 raise MyException(obj)
773 except MyException:
774 yield
775
776 obj = MyObj()
777 wr = weakref.ref(obj)
778 g = raising_gen()
779 next(g)
780 testfunc(g)
781 g = obj = None
782 obj = wr()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300783 self.assertIsNone(obj)
Antoine Pitroua370fcf2011-08-20 14:15:03 +0200784
785 def test_generator_throw_cleanup_exc_state(self):
786 def do_throw(g):
787 try:
788 g.throw(RuntimeError())
789 except RuntimeError:
790 pass
791 self._check_generator_cleanup_exc_state(do_throw)
792
793 def test_generator_close_cleanup_exc_state(self):
794 def do_close(g):
795 g.close()
796 self._check_generator_cleanup_exc_state(do_close)
797
798 def test_generator_del_cleanup_exc_state(self):
799 def do_del(g):
800 g = None
801 self._check_generator_cleanup_exc_state(do_del)
802
803 def test_generator_next_cleanup_exc_state(self):
804 def do_next(g):
805 try:
806 next(g)
807 except StopIteration:
808 pass
809 else:
810 self.fail("should have raised StopIteration")
811 self._check_generator_cleanup_exc_state(do_next)
812
813 def test_generator_send_cleanup_exc_state(self):
814 def do_send(g):
815 try:
816 g.send(None)
817 except StopIteration:
818 pass
819 else:
820 self.fail("should have raised StopIteration")
821 self._check_generator_cleanup_exc_state(do_send)
822
Benjamin Peterson27d63672008-06-15 20:09:12 +0000823 def test_3114(self):
824 # Bug #3114: in its destructor, MyObject retrieves a pointer to
825 # obsolete and/or deallocated objects.
Benjamin Peterson979f3112008-06-15 00:05:44 +0000826 class MyObject:
827 def __del__(self):
828 nonlocal e
829 e = sys.exc_info()
830 e = ()
831 try:
832 raise Exception(MyObject())
833 except:
834 pass
Ezio Melottib3aedd42010-11-20 19:04:17 +0000835 self.assertEqual(e, (None, None, None))
Benjamin Peterson979f3112008-06-15 00:05:44 +0000836
Benjamin Peterson24dfb052014-04-02 12:05:35 -0400837 def test_unicode_change_attributes(self):
Eric Smith0facd772010-02-24 15:42:29 +0000838 # See issue 7309. This was a crasher.
839
840 u = UnicodeEncodeError('baz', 'xxxxx', 1, 5, 'foo')
841 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: foo")
842 u.end = 2
843 self.assertEqual(str(u), "'baz' codec can't encode character '\\x78' in position 1: foo")
844 u.end = 5
845 u.reason = 0x345345345345345345
846 self.assertEqual(str(u), "'baz' codec can't encode characters in position 1-4: 965230951443685724997")
847 u.encoding = 4000
848 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1-4: 965230951443685724997")
849 u.start = 1000
850 self.assertEqual(str(u), "'4000' codec can't encode characters in position 1000-4: 965230951443685724997")
851
852 u = UnicodeDecodeError('baz', b'xxxxx', 1, 5, 'foo')
853 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: foo")
854 u.end = 2
855 self.assertEqual(str(u), "'baz' codec can't decode byte 0x78 in position 1: foo")
856 u.end = 5
857 u.reason = 0x345345345345345345
858 self.assertEqual(str(u), "'baz' codec can't decode bytes in position 1-4: 965230951443685724997")
859 u.encoding = 4000
860 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1-4: 965230951443685724997")
861 u.start = 1000
862 self.assertEqual(str(u), "'4000' codec can't decode bytes in position 1000-4: 965230951443685724997")
863
864 u = UnicodeTranslateError('xxxx', 1, 5, 'foo')
865 self.assertEqual(str(u), "can't translate characters in position 1-4: foo")
866 u.end = 2
867 self.assertEqual(str(u), "can't translate character '\\x78' in position 1: foo")
868 u.end = 5
869 u.reason = 0x345345345345345345
870 self.assertEqual(str(u), "can't translate characters in position 1-4: 965230951443685724997")
871 u.start = 1000
872 self.assertEqual(str(u), "can't translate characters in position 1000-4: 965230951443685724997")
Benjamin Peterson6e7740c2008-08-20 23:23:34 +0000873
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400874 def test_unicode_errors_no_object(self):
875 # See issue #21134.
Benjamin Petersone3311212014-04-02 15:51:38 -0400876 klasses = UnicodeEncodeError, UnicodeDecodeError, UnicodeTranslateError
Benjamin Peterson9b09ba12014-04-02 12:15:06 -0400877 for klass in klasses:
878 self.assertEqual(str(klass.__new__(klass)), "")
879
Brett Cannon31f59292011-02-21 19:29:56 +0000880 @no_tracing
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000881 def test_badisinstance(self):
882 # Bug #2542: if issubclass(e, MyException) raises an exception,
883 # it should be ignored
884 class Meta(type):
885 def __subclasscheck__(cls, subclass):
886 raise ValueError()
887 class MyException(Exception, metaclass=Meta):
888 pass
889
Martin Panter3263f682016-02-28 03:16:11 +0000890 with captured_stderr() as stderr:
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000891 try:
892 raise KeyError()
893 except MyException as e:
894 self.fail("exception should not be a MyException")
895 except KeyError:
896 pass
897 except:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000898 self.fail("Should have raised KeyError")
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000899 else:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000900 self.fail("Should have raised KeyError")
901
902 def g():
903 try:
904 return g()
Yury Selivanovf488fb42015-07-03 01:04:23 -0400905 except RecursionError:
Antoine Pitrouec569b72008-08-26 22:40:48 +0000906 return sys.exc_info()
907 e, v, tb = g()
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300908 self.assertIsInstance(v, RecursionError, type(v))
Benjamin Peterson577473f2010-01-19 00:09:57 +0000909 self.assertIn("maximum recursion depth exceeded", str(v))
Benjamin Peterson69c88f72008-07-31 01:47:08 +0000910
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000911
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200912 @cpython_only
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000913 def test_MemoryError(self):
914 # PyErr_NoMemory always raises the same exception instance.
915 # Check that the traceback is not doubled.
916 import traceback
Benjamin Peterson0067bd62008-08-16 16:11:03 +0000917 from _testcapi import raise_memoryerror
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000918 def raiseMemError():
919 try:
Benjamin Peterson0067bd62008-08-16 16:11:03 +0000920 raise_memoryerror()
Amaury Forgeot d'Arce19cadb2008-07-31 22:56:02 +0000921 except MemoryError as e:
922 tb = e.__traceback__
923 else:
924 self.fail("Should have raises a MemoryError")
925 return traceback.format_tb(tb)
926
927 tb1 = raiseMemError()
928 tb2 = raiseMemError()
929 self.assertEqual(tb1, tb2)
930
Benjamin Peterson17e0bbc2010-06-28 15:39:55 +0000931 @cpython_only
Georg Brandl1e28a272009-12-28 08:41:01 +0000932 def test_exception_with_doc(self):
933 import _testcapi
934 doc2 = "This is a test docstring."
935 doc4 = "This is another test docstring."
936
937 self.assertRaises(SystemError, _testcapi.make_exception_with_doc,
938 "error1")
939
940 # test basic usage of PyErr_NewException
941 error1 = _testcapi.make_exception_with_doc("_testcapi.error1")
942 self.assertIs(type(error1), type)
943 self.assertTrue(issubclass(error1, Exception))
944 self.assertIsNone(error1.__doc__)
945
946 # test with given docstring
947 error2 = _testcapi.make_exception_with_doc("_testcapi.error2", doc2)
948 self.assertEqual(error2.__doc__, doc2)
949
950 # test with explicit base (without docstring)
951 error3 = _testcapi.make_exception_with_doc("_testcapi.error3",
952 base=error2)
953 self.assertTrue(issubclass(error3, error2))
954
955 # test with explicit base tuple
956 class C(object):
957 pass
958 error4 = _testcapi.make_exception_with_doc("_testcapi.error4", doc4,
959 (error3, C))
960 self.assertTrue(issubclass(error4, error3))
961 self.assertTrue(issubclass(error4, C))
962 self.assertEqual(error4.__doc__, doc4)
963
964 # test with explicit dictionary
965 error5 = _testcapi.make_exception_with_doc("_testcapi.error5", "",
966 error4, {'a': 1})
967 self.assertTrue(issubclass(error5, error4))
968 self.assertEqual(error5.a, 1)
969 self.assertEqual(error5.__doc__, "")
970
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200971 @cpython_only
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000972 def test_memory_error_cleanup(self):
973 # Issue #5437: preallocated MemoryError instances should not keep
974 # traceback objects alive.
975 from _testcapi import raise_memoryerror
976 class C:
977 pass
978 wr = None
979 def inner():
980 nonlocal wr
981 c = C()
982 wr = weakref.ref(c)
983 raise_memoryerror()
984 # We cannot use assertRaises since it manually deletes the traceback
985 try:
986 inner()
987 except MemoryError as e:
988 self.assertNotEqual(wr(), None)
989 else:
990 self.fail("MemoryError not raised")
991 self.assertEqual(wr(), None)
992
Brett Cannon31f59292011-02-21 19:29:56 +0000993 @no_tracing
Antoine Pitrou07e20ef2010-10-28 22:56:58 +0000994 def test_recursion_error_cleanup(self):
995 # Same test as above, but with "recursion exceeded" errors
996 class C:
997 pass
998 wr = None
999 def inner():
1000 nonlocal wr
1001 c = C()
1002 wr = weakref.ref(c)
1003 inner()
1004 # We cannot use assertRaises since it manually deletes the traceback
1005 try:
1006 inner()
Yury Selivanovf488fb42015-07-03 01:04:23 -04001007 except RecursionError as e:
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001008 self.assertNotEqual(wr(), None)
1009 else:
Yury Selivanovf488fb42015-07-03 01:04:23 -04001010 self.fail("RecursionError not raised")
Antoine Pitrou07e20ef2010-10-28 22:56:58 +00001011 self.assertEqual(wr(), None)
Georg Brandl1e28a272009-12-28 08:41:01 +00001012
Antoine Pitroua7622852011-09-01 21:37:43 +02001013 def test_errno_ENOTDIR(self):
1014 # Issue #12802: "not a directory" errors are ENOTDIR even on Windows
1015 with self.assertRaises(OSError) as cm:
1016 os.listdir(__file__)
1017 self.assertEqual(cm.exception.errno, errno.ENOTDIR, cm.exception)
1018
Martin Panter3263f682016-02-28 03:16:11 +00001019 def test_unraisable(self):
1020 # Issue #22836: PyErr_WriteUnraisable() should give sensible reports
1021 class BrokenDel:
1022 def __del__(self):
1023 exc = ValueError("del is broken")
1024 # The following line is included in the traceback report:
1025 raise exc
1026
Martin Panter3263f682016-02-28 03:16:11 +00001027 class BrokenExceptionDel:
1028 def __del__(self):
1029 exc = BrokenStrException()
1030 # The following line is included in the traceback report:
1031 raise exc
1032
Victor Stinner331bbe62017-02-09 23:49:50 +01001033 for test_class in (BrokenDel, BrokenExceptionDel):
Martin Panter3263f682016-02-28 03:16:11 +00001034 with self.subTest(test_class):
1035 obj = test_class()
1036 with captured_stderr() as stderr:
1037 del obj
1038 report = stderr.getvalue()
1039 self.assertIn("Exception ignored", report)
Victor Stinner331bbe62017-02-09 23:49:50 +01001040 self.assertIn(test_class.__del__.__qualname__, report)
Martin Panter3263f682016-02-28 03:16:11 +00001041 self.assertIn("test_exceptions.py", report)
1042 self.assertIn("raise exc", report)
1043 if test_class is BrokenExceptionDel:
1044 self.assertIn("BrokenStrException", report)
1045 self.assertIn("<exception str() failed>", report)
1046 else:
1047 self.assertIn("ValueError", report)
1048 self.assertIn("del is broken", report)
1049 self.assertTrue(report.endswith("\n"))
1050
1051 def test_unhandled(self):
1052 # Check for sensible reporting of unhandled exceptions
1053 for exc_type in (ValueError, BrokenStrException):
1054 with self.subTest(exc_type):
1055 try:
1056 exc = exc_type("test message")
1057 # The following line is included in the traceback report:
1058 raise exc
1059 except exc_type:
1060 with captured_stderr() as stderr:
1061 sys.__excepthook__(*sys.exc_info())
1062 report = stderr.getvalue()
1063 self.assertIn("test_exceptions.py", report)
1064 self.assertIn("raise exc", report)
1065 self.assertIn(exc_type.__name__, report)
1066 if exc_type is BrokenStrException:
1067 self.assertIn("<exception str() failed>", report)
1068 else:
1069 self.assertIn("test message", report)
1070 self.assertTrue(report.endswith("\n"))
1071
Antoine Pitroua7622852011-09-01 21:37:43 +02001072
Brett Cannon79ec55e2012-04-12 20:24:54 -04001073class ImportErrorTests(unittest.TestCase):
1074
1075 def test_attributes(self):
1076 # Setting 'name' and 'path' should not be a problem.
1077 exc = ImportError('test')
1078 self.assertIsNone(exc.name)
1079 self.assertIsNone(exc.path)
1080
1081 exc = ImportError('test', name='somemodule')
1082 self.assertEqual(exc.name, 'somemodule')
1083 self.assertIsNone(exc.path)
1084
1085 exc = ImportError('test', path='somepath')
1086 self.assertEqual(exc.path, 'somepath')
1087 self.assertIsNone(exc.name)
1088
1089 exc = ImportError('test', path='somepath', name='somename')
1090 self.assertEqual(exc.name, 'somename')
1091 self.assertEqual(exc.path, 'somepath')
1092
Michael Seifert64c8f702017-04-09 09:47:12 +02001093 msg = "'invalid' is an invalid keyword argument for ImportError"
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001094 with self.assertRaisesRegex(TypeError, msg):
1095 ImportError('test', invalid='keyword')
1096
1097 with self.assertRaisesRegex(TypeError, msg):
1098 ImportError('test', name='name', invalid='keyword')
1099
1100 with self.assertRaisesRegex(TypeError, msg):
1101 ImportError('test', path='path', invalid='keyword')
1102
1103 with self.assertRaisesRegex(TypeError, msg):
1104 ImportError(invalid='keyword')
1105
Serhiy Storchaka47dee112016-09-27 20:45:35 +03001106 with self.assertRaisesRegex(TypeError, msg):
1107 ImportError('test', invalid='keyword', another=True)
1108
Serhiy Storchakae9e44482016-09-28 07:53:32 +03001109 def test_reset_attributes(self):
1110 exc = ImportError('test', name='name', path='path')
1111 self.assertEqual(exc.args, ('test',))
1112 self.assertEqual(exc.msg, 'test')
1113 self.assertEqual(exc.name, 'name')
1114 self.assertEqual(exc.path, 'path')
1115
1116 # Reset not specified attributes
1117 exc.__init__()
1118 self.assertEqual(exc.args, ())
1119 self.assertEqual(exc.msg, None)
1120 self.assertEqual(exc.name, None)
1121 self.assertEqual(exc.path, None)
1122
Brett Cannon07c6e712012-08-24 13:05:09 -04001123 def test_non_str_argument(self):
1124 # Issue #15778
Nadeem Vawda6d708702012-10-14 01:42:32 +02001125 with check_warnings(('', BytesWarning), quiet=True):
1126 arg = b'abc'
1127 exc = ImportError(arg)
1128 self.assertEqual(str(arg), str(exc))
Brett Cannon79ec55e2012-04-12 20:24:54 -04001129
Serhiy Storchakab7853962017-04-08 09:55:07 +03001130 def test_copy_pickle(self):
1131 for kwargs in (dict(),
1132 dict(name='somename'),
1133 dict(path='somepath'),
1134 dict(name='somename', path='somepath')):
1135 orig = ImportError('test', **kwargs)
1136 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
1137 exc = pickle.loads(pickle.dumps(orig, proto))
1138 self.assertEqual(exc.args, ('test',))
1139 self.assertEqual(exc.msg, 'test')
1140 self.assertEqual(exc.name, orig.name)
1141 self.assertEqual(exc.path, orig.path)
1142 for c in copy.copy, copy.deepcopy:
1143 exc = c(orig)
1144 self.assertEqual(exc.args, ('test',))
1145 self.assertEqual(exc.msg, 'test')
1146 self.assertEqual(exc.name, orig.name)
1147 self.assertEqual(exc.path, orig.path)
1148
Brett Cannon79ec55e2012-04-12 20:24:54 -04001149
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001150if __name__ == '__main__':
Guido van Rossumb8142c32007-05-08 17:49:10 +00001151 unittest.main()