blob: 103f6086d2068ba1e7c74403cbed3813b0a860a2 [file] [log] [blame]
Collin Winter828f04a2007-08-31 00:04:24 +00001# Copyright 2007 Google, Inc. All Rights Reserved.
2# Licensed to PSF under a Contributor Agreement.
3
4"""Tests for the raise statement."""
5
Nick Coghlan1d5ccdb2012-05-21 23:03:30 +10006from test import support
Collin Winter828f04a2007-08-31 00:04:24 +00007import sys
8import types
9import unittest
10
11
12def get_tb():
13 try:
14 raise OSError()
15 except:
16 return sys.exc_info()[2]
17
18
Benjamin Petersoneec3d712008-06-11 15:59:43 +000019class Context:
20 def __enter__(self):
21 return self
22 def __exit__(self, exc_type, exc_value, exc_tb):
23 return True
24
25
Collin Winter828f04a2007-08-31 00:04:24 +000026class TestRaise(unittest.TestCase):
27 def test_invalid_reraise(self):
28 try:
29 raise
30 except RuntimeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +000031 self.assertIn("No active exception", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +000032 else:
33 self.fail("No exception raised")
34
35 def test_reraise(self):
36 try:
37 try:
38 raise IndexError()
39 except IndexError as e:
40 exc1 = e
41 raise
42 except IndexError as exc2:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +030043 self.assertIs(exc1, exc2)
Collin Winter828f04a2007-08-31 00:04:24 +000044 else:
45 self.fail("No exception raised")
46
Benjamin Petersoneec3d712008-06-11 15:59:43 +000047 def test_except_reraise(self):
48 def reraise():
49 try:
50 raise TypeError("foo")
51 except:
52 try:
53 raise KeyError("caught")
54 except KeyError:
55 pass
56 raise
57 self.assertRaises(TypeError, reraise)
58
59 def test_finally_reraise(self):
60 def reraise():
61 try:
62 raise TypeError("foo")
63 except:
64 try:
65 raise KeyError("caught")
66 finally:
67 raise
68 self.assertRaises(KeyError, reraise)
69
70 def test_nested_reraise(self):
71 def nested_reraise():
72 raise
73 def reraise():
74 try:
75 raise TypeError("foo")
76 except:
77 nested_reraise()
78 self.assertRaises(TypeError, reraise)
79
Nick Coghlanab7bf212012-02-26 17:49:52 +100080 def test_raise_from_None(self):
81 try:
82 try:
83 raise TypeError("foo")
84 except:
85 raise ValueError() from None
86 except ValueError as e:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +030087 self.assertIsInstance(e.__context__, TypeError)
Nick Coghlanab7bf212012-02-26 17:49:52 +100088 self.assertIsNone(e.__cause__)
89
Benjamin Petersoneec3d712008-06-11 15:59:43 +000090 def test_with_reraise1(self):
91 def reraise():
92 try:
93 raise TypeError("foo")
94 except:
95 with Context():
96 pass
97 raise
98 self.assertRaises(TypeError, reraise)
99
100 def test_with_reraise2(self):
101 def reraise():
102 try:
103 raise TypeError("foo")
104 except:
105 with Context():
106 raise KeyError("caught")
107 raise
108 self.assertRaises(TypeError, reraise)
109
110 def test_yield_reraise(self):
111 def reraise():
112 try:
113 raise TypeError("foo")
114 except:
115 yield 1
116 raise
117 g = reraise()
118 next(g)
119 self.assertRaises(TypeError, lambda: next(g))
120 self.assertRaises(StopIteration, lambda: next(g))
121
Collin Winter1966f1c2007-09-01 20:26:44 +0000122 def test_erroneous_exception(self):
123 class MyException(Exception):
124 def __init__(self):
125 raise RuntimeError()
126
127 try:
128 raise MyException
129 except RuntimeError:
130 pass
131 else:
132 self.fail("No exception raised")
133
Benjamin Peterson5afa03a2011-07-15 14:09:26 -0500134 def test_new_returns_invalid_instance(self):
135 # See issue #11627.
136 class MyException(Exception):
137 def __new__(cls, *args):
138 return object()
139
140 with self.assertRaises(TypeError):
141 raise MyException
142
Benjamin Peterson2f8dfcd2011-10-27 08:20:01 -0400143 def test_assert_with_tuple_arg(self):
144 try:
145 assert False, (3,)
146 except AssertionError as e:
147 self.assertEqual(str(e), "(3,)")
148
149
Collin Winter828f04a2007-08-31 00:04:24 +0000150
151class TestCause(unittest.TestCase):
Nick Coghlanab7bf212012-02-26 17:49:52 +1000152
153 def testCauseSyntax(self):
154 try:
155 try:
156 try:
157 raise TypeError
158 except Exception:
159 raise ValueError from None
160 except ValueError as exc:
161 self.assertIsNone(exc.__cause__)
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700162 self.assertTrue(exc.__suppress_context__)
163 exc.__suppress_context__ = False
164 raise exc
Nick Coghlanab7bf212012-02-26 17:49:52 +1000165 except ValueError as exc:
166 e = exc
167
Benjamin Petersond5a1c442012-05-14 22:09:31 -0700168 self.assertIsNone(e.__cause__)
169 self.assertFalse(e.__suppress_context__)
Nick Coghlanab7bf212012-02-26 17:49:52 +1000170 self.assertIsInstance(e.__context__, TypeError)
171
Collin Winter828f04a2007-08-31 00:04:24 +0000172 def test_invalid_cause(self):
173 try:
174 raise IndexError from 5
175 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000176 self.assertIn("exception cause", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000177 else:
178 self.fail("No exception raised")
179
180 def test_class_cause(self):
181 try:
182 raise IndexError from KeyError
183 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000184 self.assertIsInstance(e.__cause__, KeyError)
Collin Winter828f04a2007-08-31 00:04:24 +0000185 else:
186 self.fail("No exception raised")
187
188 def test_instance_cause(self):
189 cause = KeyError()
190 try:
191 raise IndexError from cause
192 except IndexError as e:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300193 self.assertIs(e.__cause__, cause)
Collin Winter828f04a2007-08-31 00:04:24 +0000194 else:
195 self.fail("No exception raised")
196
Collin Winter1966f1c2007-09-01 20:26:44 +0000197 def test_erroneous_cause(self):
198 class MyException(Exception):
199 def __init__(self):
200 raise RuntimeError()
201
202 try:
203 raise IndexError from MyException
204 except RuntimeError:
205 pass
206 else:
207 self.fail("No exception raised")
208
Collin Winter828f04a2007-08-31 00:04:24 +0000209
210class TestTraceback(unittest.TestCase):
Nick Coghlanab7bf212012-02-26 17:49:52 +1000211
Collin Winter828f04a2007-08-31 00:04:24 +0000212 def test_sets_traceback(self):
213 try:
214 raise IndexError()
215 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000216 self.assertIsInstance(e.__traceback__, types.TracebackType)
Collin Winter828f04a2007-08-31 00:04:24 +0000217 else:
218 self.fail("No exception raised")
219
220 def test_accepts_traceback(self):
221 tb = get_tb()
222 try:
223 raise IndexError().with_traceback(tb)
224 except IndexError as e:
225 self.assertNotEqual(e.__traceback__, tb)
226 self.assertEqual(e.__traceback__.tb_next, tb)
227 else:
228 self.fail("No exception raised")
229
230
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000231class TestContext(unittest.TestCase):
232 def test_instance_context_instance_raise(self):
233 context = IndexError()
234 try:
235 try:
236 raise context
237 except:
238 raise OSError()
239 except OSError as e:
240 self.assertEqual(e.__context__, context)
241 else:
242 self.fail("No exception raised")
243
244 def test_class_context_instance_raise(self):
245 context = IndexError
246 try:
247 try:
248 raise context
249 except:
250 raise OSError()
251 except OSError as e:
252 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000253 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000254 else:
255 self.fail("No exception raised")
256
257 def test_class_context_class_raise(self):
258 context = IndexError
259 try:
260 try:
261 raise context
262 except:
263 raise OSError
264 except OSError as e:
265 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000266 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000267 else:
268 self.fail("No exception raised")
269
270 def test_c_exception_context(self):
271 try:
272 try:
273 1/0
274 except:
275 raise OSError
276 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000277 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000278 else:
279 self.fail("No exception raised")
280
281 def test_c_exception_raise(self):
282 try:
283 try:
284 1/0
285 except:
286 xyzzy
287 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000288 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000289 else:
290 self.fail("No exception raised")
291
292 def test_noraise_finally(self):
293 try:
294 try:
295 pass
296 finally:
297 raise OSError
298 except OSError as e:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300299 self.assertIsNone(e.__context__)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000300 else:
301 self.fail("No exception raised")
302
303 def test_raise_finally(self):
304 try:
305 try:
306 1/0
307 finally:
308 raise OSError
309 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000310 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000311 else:
312 self.fail("No exception raised")
313
314 def test_context_manager(self):
315 class ContextManager:
316 def __enter__(self):
317 pass
318 def __exit__(self, t, v, tb):
319 xyzzy
320 try:
321 with ContextManager():
322 1/0
323 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000324 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000325 else:
326 self.fail("No exception raised")
Collin Winter828f04a2007-08-31 00:04:24 +0000327
Benjamin Petersone6528212008-07-15 15:32:09 +0000328 def test_cycle_broken(self):
329 # Self-cycles (when re-raising a caught exception) are broken
330 try:
331 try:
332 1/0
333 except ZeroDivisionError as e:
334 raise e
335 except ZeroDivisionError as e:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300336 self.assertIsNone(e.__context__)
Benjamin Petersone6528212008-07-15 15:32:09 +0000337
338 def test_reraise_cycle_broken(self):
339 # Non-trivial context cycles (through re-raising a previous exception)
340 # are broken too.
341 try:
342 try:
343 xyzzy
344 except NameError as a:
345 try:
346 1/0
347 except ZeroDivisionError:
348 raise a
349 except NameError as e:
Serhiy Storchakaf15c4d32017-03-30 18:05:08 +0300350 self.assertIsNone(e.__context__.__context__)
Benjamin Petersone6528212008-07-15 15:32:09 +0000351
Benjamin Peterson9b676022008-08-21 17:00:40 +0000352 def test_3118(self):
353 # deleting the generator caused the __context__ to be cleared
354 def gen():
355 try:
356 yield 1
357 finally:
358 pass
359
360 def f():
361 g = gen()
362 next(g)
363 try:
364 try:
365 raise ValueError
366 except:
367 del g
368 raise KeyError
369 except Exception as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000370 self.assertIsInstance(e.__context__, ValueError)
Benjamin Peterson9b676022008-08-21 17:00:40 +0000371
372 f()
373
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000374 def test_3611(self):
375 # A re-raised exception in a __del__ caused the __context__
376 # to be cleared
377 class C:
378 def __del__(self):
379 try:
380 1/0
381 except:
382 raise
383
384 def f():
385 x = C()
386 try:
387 try:
388 x.x
389 except AttributeError:
390 del x
391 raise TypeError
392 except Exception as e:
393 self.assertNotEqual(e.__context__, None)
Ezio Melottie9615932010-01-24 19:26:24 +0000394 self.assertIsInstance(e.__context__, AttributeError)
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000395
396 with support.captured_output("stderr"):
397 f()
Collin Winter828f04a2007-08-31 00:04:24 +0000398
399class TestRemovedFunctionality(unittest.TestCase):
400 def test_tuples(self):
401 try:
402 raise (IndexError, KeyError) # This should be a tuple!
403 except TypeError:
404 pass
405 else:
406 self.fail("No exception raised")
407
408 def test_strings(self):
409 try:
410 raise "foo"
411 except TypeError:
412 pass
413 else:
414 self.fail("No exception raised")
415
416
Collin Winter828f04a2007-08-31 00:04:24 +0000417if __name__ == "__main__":
418 unittest.main()