blob: e02c1af1314d3dc51bc99b9fd24a41c08ca23040 [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
Collin Winter828f04a2007-08-31 00:04:24 +0000133
134class TestCause(unittest.TestCase):
135 def test_invalid_cause(self):
136 try:
137 raise IndexError from 5
138 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000139 self.assertIn("exception cause", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000140 else:
141 self.fail("No exception raised")
142
143 def test_class_cause(self):
144 try:
145 raise IndexError from KeyError
146 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000147 self.assertIsInstance(e.__cause__, KeyError)
Collin Winter828f04a2007-08-31 00:04:24 +0000148 else:
149 self.fail("No exception raised")
150
151 def test_instance_cause(self):
152 cause = KeyError()
153 try:
154 raise IndexError from cause
155 except IndexError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000156 self.assertTrue(e.__cause__ is cause)
Collin Winter828f04a2007-08-31 00:04:24 +0000157 else:
158 self.fail("No exception raised")
159
Collin Winter1966f1c2007-09-01 20:26:44 +0000160 def test_erroneous_cause(self):
161 class MyException(Exception):
162 def __init__(self):
163 raise RuntimeError()
164
165 try:
166 raise IndexError from MyException
167 except RuntimeError:
168 pass
169 else:
170 self.fail("No exception raised")
171
Collin Winter828f04a2007-08-31 00:04:24 +0000172
173class TestTraceback(unittest.TestCase):
174 def test_sets_traceback(self):
175 try:
176 raise IndexError()
177 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000178 self.assertIsInstance(e.__traceback__, types.TracebackType)
Collin Winter828f04a2007-08-31 00:04:24 +0000179 else:
180 self.fail("No exception raised")
181
182 def test_accepts_traceback(self):
183 tb = get_tb()
184 try:
185 raise IndexError().with_traceback(tb)
186 except IndexError as e:
187 self.assertNotEqual(e.__traceback__, tb)
188 self.assertEqual(e.__traceback__.tb_next, tb)
189 else:
190 self.fail("No exception raised")
191
192
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000193class TestContext(unittest.TestCase):
194 def test_instance_context_instance_raise(self):
195 context = IndexError()
196 try:
197 try:
198 raise context
199 except:
200 raise OSError()
201 except OSError as e:
202 self.assertEqual(e.__context__, context)
203 else:
204 self.fail("No exception raised")
205
206 def test_class_context_instance_raise(self):
207 context = IndexError
208 try:
209 try:
210 raise context
211 except:
212 raise OSError()
213 except OSError as e:
214 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000215 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000216 else:
217 self.fail("No exception raised")
218
219 def test_class_context_class_raise(self):
220 context = IndexError
221 try:
222 try:
223 raise context
224 except:
225 raise OSError
226 except OSError as e:
227 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000228 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000229 else:
230 self.fail("No exception raised")
231
232 def test_c_exception_context(self):
233 try:
234 try:
235 1/0
236 except:
237 raise OSError
238 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000239 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000240 else:
241 self.fail("No exception raised")
242
243 def test_c_exception_raise(self):
244 try:
245 try:
246 1/0
247 except:
248 xyzzy
249 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000250 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000251 else:
252 self.fail("No exception raised")
253
254 def test_noraise_finally(self):
255 try:
256 try:
257 pass
258 finally:
259 raise OSError
260 except OSError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000261 self.assertTrue(e.__context__ is None)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000262 else:
263 self.fail("No exception raised")
264
265 def test_raise_finally(self):
266 try:
267 try:
268 1/0
269 finally:
270 raise OSError
271 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000272 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000273 else:
274 self.fail("No exception raised")
275
276 def test_context_manager(self):
277 class ContextManager:
278 def __enter__(self):
279 pass
280 def __exit__(self, t, v, tb):
281 xyzzy
282 try:
283 with ContextManager():
284 1/0
285 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000286 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000287 else:
288 self.fail("No exception raised")
Collin Winter828f04a2007-08-31 00:04:24 +0000289
Benjamin Petersone6528212008-07-15 15:32:09 +0000290 def test_cycle_broken(self):
291 # Self-cycles (when re-raising a caught exception) are broken
292 try:
293 try:
294 1/0
295 except ZeroDivisionError as e:
296 raise e
297 except ZeroDivisionError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000298 self.assertTrue(e.__context__ is None, e.__context__)
Benjamin Petersone6528212008-07-15 15:32:09 +0000299
300 def test_reraise_cycle_broken(self):
301 # Non-trivial context cycles (through re-raising a previous exception)
302 # are broken too.
303 try:
304 try:
305 xyzzy
306 except NameError as a:
307 try:
308 1/0
309 except ZeroDivisionError:
310 raise a
311 except NameError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000312 self.assertTrue(e.__context__.__context__ is None)
Benjamin Petersone6528212008-07-15 15:32:09 +0000313
Benjamin Peterson9b676022008-08-21 17:00:40 +0000314 def test_3118(self):
315 # deleting the generator caused the __context__ to be cleared
316 def gen():
317 try:
318 yield 1
319 finally:
320 pass
321
322 def f():
323 g = gen()
324 next(g)
325 try:
326 try:
327 raise ValueError
328 except:
329 del g
330 raise KeyError
331 except Exception as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000332 self.assertIsInstance(e.__context__, ValueError)
Benjamin Peterson9b676022008-08-21 17:00:40 +0000333
334 f()
335
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000336 def test_3611(self):
337 # A re-raised exception in a __del__ caused the __context__
338 # to be cleared
339 class C:
340 def __del__(self):
341 try:
342 1/0
343 except:
344 raise
345
346 def f():
347 x = C()
348 try:
349 try:
350 x.x
351 except AttributeError:
352 del x
353 raise TypeError
354 except Exception as e:
355 self.assertNotEqual(e.__context__, None)
Ezio Melottie9615932010-01-24 19:26:24 +0000356 self.assertIsInstance(e.__context__, AttributeError)
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000357
358 with support.captured_output("stderr"):
359 f()
Collin Winter828f04a2007-08-31 00:04:24 +0000360
361class TestRemovedFunctionality(unittest.TestCase):
362 def test_tuples(self):
363 try:
364 raise (IndexError, KeyError) # This should be a tuple!
365 except TypeError:
366 pass
367 else:
368 self.fail("No exception raised")
369
370 def test_strings(self):
371 try:
372 raise "foo"
373 except TypeError:
374 pass
375 else:
376 self.fail("No exception raised")
377
378
379def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000380 support.run_unittest(__name__)
Collin Winter828f04a2007-08-31 00:04:24 +0000381
Collin Winter828f04a2007-08-31 00:04:24 +0000382if __name__ == "__main__":
383 unittest.main()