blob: 92c50c79ee168701e040b1d8979a26b1efc7376f [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
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from 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:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000043 self.assertTrue(exc1 is 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
80 def test_with_reraise1(self):
81 def reraise():
82 try:
83 raise TypeError("foo")
84 except:
85 with Context():
86 pass
87 raise
88 self.assertRaises(TypeError, reraise)
89
90 def test_with_reraise2(self):
91 def reraise():
92 try:
93 raise TypeError("foo")
94 except:
95 with Context():
96 raise KeyError("caught")
97 raise
98 self.assertRaises(TypeError, reraise)
99
100 def test_yield_reraise(self):
101 def reraise():
102 try:
103 raise TypeError("foo")
104 except:
105 yield 1
106 raise
107 g = reraise()
108 next(g)
109 self.assertRaises(TypeError, lambda: next(g))
110 self.assertRaises(StopIteration, lambda: next(g))
111
Collin Winter1966f1c2007-09-01 20:26:44 +0000112 def test_erroneous_exception(self):
113 class MyException(Exception):
114 def __init__(self):
115 raise RuntimeError()
116
117 try:
118 raise MyException
119 except RuntimeError:
120 pass
121 else:
122 self.fail("No exception raised")
123
Benjamin Peterson5afa03a2011-07-15 14:09:26 -0500124 def test_new_returns_invalid_instance(self):
125 # See issue #11627.
126 class MyException(Exception):
127 def __new__(cls, *args):
128 return object()
129
130 with self.assertRaises(TypeError):
131 raise MyException
132
Benjamin Peterson2f8dfcd2011-10-27 08:20:01 -0400133 def test_assert_with_tuple_arg(self):
134 try:
135 assert False, (3,)
136 except AssertionError as e:
137 self.assertEqual(str(e), "(3,)")
138
139
Collin Winter828f04a2007-08-31 00:04:24 +0000140
141class TestCause(unittest.TestCase):
142 def test_invalid_cause(self):
143 try:
144 raise IndexError from 5
145 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000146 self.assertIn("exception cause", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000147 else:
148 self.fail("No exception raised")
149
150 def test_class_cause(self):
151 try:
152 raise IndexError from KeyError
153 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000154 self.assertIsInstance(e.__cause__, KeyError)
Collin Winter828f04a2007-08-31 00:04:24 +0000155 else:
156 self.fail("No exception raised")
157
158 def test_instance_cause(self):
159 cause = KeyError()
160 try:
161 raise IndexError from cause
162 except IndexError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000163 self.assertTrue(e.__cause__ is cause)
Collin Winter828f04a2007-08-31 00:04:24 +0000164 else:
165 self.fail("No exception raised")
166
Collin Winter1966f1c2007-09-01 20:26:44 +0000167 def test_erroneous_cause(self):
168 class MyException(Exception):
169 def __init__(self):
170 raise RuntimeError()
171
172 try:
173 raise IndexError from MyException
174 except RuntimeError:
175 pass
176 else:
177 self.fail("No exception raised")
178
Collin Winter828f04a2007-08-31 00:04:24 +0000179
180class TestTraceback(unittest.TestCase):
181 def test_sets_traceback(self):
182 try:
183 raise IndexError()
184 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000185 self.assertIsInstance(e.__traceback__, types.TracebackType)
Collin Winter828f04a2007-08-31 00:04:24 +0000186 else:
187 self.fail("No exception raised")
188
189 def test_accepts_traceback(self):
190 tb = get_tb()
191 try:
192 raise IndexError().with_traceback(tb)
193 except IndexError as e:
194 self.assertNotEqual(e.__traceback__, tb)
195 self.assertEqual(e.__traceback__.tb_next, tb)
196 else:
197 self.fail("No exception raised")
198
199
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000200class TestContext(unittest.TestCase):
201 def test_instance_context_instance_raise(self):
202 context = IndexError()
203 try:
204 try:
205 raise context
206 except:
207 raise OSError()
208 except OSError as e:
209 self.assertEqual(e.__context__, context)
210 else:
211 self.fail("No exception raised")
212
213 def test_class_context_instance_raise(self):
214 context = IndexError
215 try:
216 try:
217 raise context
218 except:
219 raise OSError()
220 except OSError as e:
221 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000222 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000223 else:
224 self.fail("No exception raised")
225
226 def test_class_context_class_raise(self):
227 context = IndexError
228 try:
229 try:
230 raise context
231 except:
232 raise OSError
233 except OSError as e:
234 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000235 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000236 else:
237 self.fail("No exception raised")
238
239 def test_c_exception_context(self):
240 try:
241 try:
242 1/0
243 except:
244 raise OSError
245 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000246 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000247 else:
248 self.fail("No exception raised")
249
250 def test_c_exception_raise(self):
251 try:
252 try:
253 1/0
254 except:
255 xyzzy
256 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000257 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000258 else:
259 self.fail("No exception raised")
260
261 def test_noraise_finally(self):
262 try:
263 try:
264 pass
265 finally:
266 raise OSError
267 except OSError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(e.__context__ is None)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000269 else:
270 self.fail("No exception raised")
271
272 def test_raise_finally(self):
273 try:
274 try:
275 1/0
276 finally:
277 raise OSError
278 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000279 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000280 else:
281 self.fail("No exception raised")
282
283 def test_context_manager(self):
284 class ContextManager:
285 def __enter__(self):
286 pass
287 def __exit__(self, t, v, tb):
288 xyzzy
289 try:
290 with ContextManager():
291 1/0
292 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000293 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000294 else:
295 self.fail("No exception raised")
Collin Winter828f04a2007-08-31 00:04:24 +0000296
Benjamin Petersone6528212008-07-15 15:32:09 +0000297 def test_cycle_broken(self):
298 # Self-cycles (when re-raising a caught exception) are broken
299 try:
300 try:
301 1/0
302 except ZeroDivisionError as e:
303 raise e
304 except ZeroDivisionError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000305 self.assertTrue(e.__context__ is None, e.__context__)
Benjamin Petersone6528212008-07-15 15:32:09 +0000306
307 def test_reraise_cycle_broken(self):
308 # Non-trivial context cycles (through re-raising a previous exception)
309 # are broken too.
310 try:
311 try:
312 xyzzy
313 except NameError as a:
314 try:
315 1/0
316 except ZeroDivisionError:
317 raise a
318 except NameError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000319 self.assertTrue(e.__context__.__context__ is None)
Benjamin Petersone6528212008-07-15 15:32:09 +0000320
Benjamin Peterson9b676022008-08-21 17:00:40 +0000321 def test_3118(self):
322 # deleting the generator caused the __context__ to be cleared
323 def gen():
324 try:
325 yield 1
326 finally:
327 pass
328
329 def f():
330 g = gen()
331 next(g)
332 try:
333 try:
334 raise ValueError
335 except:
336 del g
337 raise KeyError
338 except Exception as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000339 self.assertIsInstance(e.__context__, ValueError)
Benjamin Peterson9b676022008-08-21 17:00:40 +0000340
341 f()
342
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000343 def test_3611(self):
344 # A re-raised exception in a __del__ caused the __context__
345 # to be cleared
346 class C:
347 def __del__(self):
348 try:
349 1/0
350 except:
351 raise
352
353 def f():
354 x = C()
355 try:
356 try:
357 x.x
358 except AttributeError:
359 del x
360 raise TypeError
361 except Exception as e:
362 self.assertNotEqual(e.__context__, None)
Ezio Melottie9615932010-01-24 19:26:24 +0000363 self.assertIsInstance(e.__context__, AttributeError)
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000364
365 with support.captured_output("stderr"):
366 f()
Collin Winter828f04a2007-08-31 00:04:24 +0000367
368class TestRemovedFunctionality(unittest.TestCase):
369 def test_tuples(self):
370 try:
371 raise (IndexError, KeyError) # This should be a tuple!
372 except TypeError:
373 pass
374 else:
375 self.fail("No exception raised")
376
377 def test_strings(self):
378 try:
379 raise "foo"
380 except TypeError:
381 pass
382 else:
383 self.fail("No exception raised")
384
385
386def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000387 support.run_unittest(__name__)
Collin Winter828f04a2007-08-31 00:04:24 +0000388
Collin Winter828f04a2007-08-31 00:04:24 +0000389if __name__ == "__main__":
390 unittest.main()