blob: d120dc1afa900a18bf0ceb285d0a2e37bd7ea452 [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
Collin Winter828f04a2007-08-31 00:04:24 +0000124
125class TestCause(unittest.TestCase):
126 def test_invalid_cause(self):
127 try:
128 raise IndexError from 5
129 except TypeError as e:
Benjamin Peterson577473f2010-01-19 00:09:57 +0000130 self.assertIn("exception cause", str(e))
Collin Winter828f04a2007-08-31 00:04:24 +0000131 else:
132 self.fail("No exception raised")
133
134 def test_class_cause(self):
135 try:
136 raise IndexError from KeyError
137 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000138 self.assertIsInstance(e.__cause__, KeyError)
Collin Winter828f04a2007-08-31 00:04:24 +0000139 else:
140 self.fail("No exception raised")
141
142 def test_instance_cause(self):
143 cause = KeyError()
144 try:
145 raise IndexError from cause
146 except IndexError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000147 self.assertTrue(e.__cause__ is cause)
Collin Winter828f04a2007-08-31 00:04:24 +0000148 else:
149 self.fail("No exception raised")
150
Collin Winter1966f1c2007-09-01 20:26:44 +0000151 def test_erroneous_cause(self):
152 class MyException(Exception):
153 def __init__(self):
154 raise RuntimeError()
155
156 try:
157 raise IndexError from MyException
158 except RuntimeError:
159 pass
160 else:
161 self.fail("No exception raised")
162
Collin Winter828f04a2007-08-31 00:04:24 +0000163
164class TestTraceback(unittest.TestCase):
165 def test_sets_traceback(self):
166 try:
167 raise IndexError()
168 except IndexError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000169 self.assertIsInstance(e.__traceback__, types.TracebackType)
Collin Winter828f04a2007-08-31 00:04:24 +0000170 else:
171 self.fail("No exception raised")
172
173 def test_accepts_traceback(self):
174 tb = get_tb()
175 try:
176 raise IndexError().with_traceback(tb)
177 except IndexError as e:
178 self.assertNotEqual(e.__traceback__, tb)
179 self.assertEqual(e.__traceback__.tb_next, tb)
180 else:
181 self.fail("No exception raised")
182
183
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000184class TestContext(unittest.TestCase):
185 def test_instance_context_instance_raise(self):
186 context = IndexError()
187 try:
188 try:
189 raise context
190 except:
191 raise OSError()
192 except OSError as e:
193 self.assertEqual(e.__context__, context)
194 else:
195 self.fail("No exception raised")
196
197 def test_class_context_instance_raise(self):
198 context = IndexError
199 try:
200 try:
201 raise context
202 except:
203 raise OSError()
204 except OSError as e:
205 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000206 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000207 else:
208 self.fail("No exception raised")
209
210 def test_class_context_class_raise(self):
211 context = IndexError
212 try:
213 try:
214 raise context
215 except:
216 raise OSError
217 except OSError as e:
218 self.assertNotEqual(e.__context__, context)
Ezio Melottie9615932010-01-24 19:26:24 +0000219 self.assertIsInstance(e.__context__, context)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000220 else:
221 self.fail("No exception raised")
222
223 def test_c_exception_context(self):
224 try:
225 try:
226 1/0
227 except:
228 raise OSError
229 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000230 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000231 else:
232 self.fail("No exception raised")
233
234 def test_c_exception_raise(self):
235 try:
236 try:
237 1/0
238 except:
239 xyzzy
240 except NameError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000241 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000242 else:
243 self.fail("No exception raised")
244
245 def test_noraise_finally(self):
246 try:
247 try:
248 pass
249 finally:
250 raise OSError
251 except OSError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000252 self.assertTrue(e.__context__ is None)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000253 else:
254 self.fail("No exception raised")
255
256 def test_raise_finally(self):
257 try:
258 try:
259 1/0
260 finally:
261 raise OSError
262 except OSError as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000263 self.assertIsInstance(e.__context__, ZeroDivisionError)
Guido van Rossumb4fb6e42008-06-14 20:20:24 +0000264 else:
265 self.fail("No exception raised")
266
267 def test_context_manager(self):
268 class ContextManager:
269 def __enter__(self):
270 pass
271 def __exit__(self, t, v, tb):
272 xyzzy
273 try:
274 with ContextManager():
275 1/0
276 except NameError 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")
Collin Winter828f04a2007-08-31 00:04:24 +0000280
Benjamin Petersone6528212008-07-15 15:32:09 +0000281 def test_cycle_broken(self):
282 # Self-cycles (when re-raising a caught exception) are broken
283 try:
284 try:
285 1/0
286 except ZeroDivisionError as e:
287 raise e
288 except ZeroDivisionError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000289 self.assertTrue(e.__context__ is None, e.__context__)
Benjamin Petersone6528212008-07-15 15:32:09 +0000290
291 def test_reraise_cycle_broken(self):
292 # Non-trivial context cycles (through re-raising a previous exception)
293 # are broken too.
294 try:
295 try:
296 xyzzy
297 except NameError as a:
298 try:
299 1/0
300 except ZeroDivisionError:
301 raise a
302 except NameError as e:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000303 self.assertTrue(e.__context__.__context__ is None)
Benjamin Petersone6528212008-07-15 15:32:09 +0000304
Benjamin Peterson9b676022008-08-21 17:00:40 +0000305 def test_3118(self):
306 # deleting the generator caused the __context__ to be cleared
307 def gen():
308 try:
309 yield 1
310 finally:
311 pass
312
313 def f():
314 g = gen()
315 next(g)
316 try:
317 try:
318 raise ValueError
319 except:
320 del g
321 raise KeyError
322 except Exception as e:
Ezio Melottie9615932010-01-24 19:26:24 +0000323 self.assertIsInstance(e.__context__, ValueError)
Benjamin Peterson9b676022008-08-21 17:00:40 +0000324
325 f()
326
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000327 def test_3611(self):
328 # A re-raised exception in a __del__ caused the __context__
329 # to be cleared
330 class C:
331 def __del__(self):
332 try:
333 1/0
334 except:
335 raise
336
337 def f():
338 x = C()
339 try:
340 try:
341 x.x
342 except AttributeError:
343 del x
344 raise TypeError
345 except Exception as e:
346 self.assertNotEqual(e.__context__, None)
Ezio Melottie9615932010-01-24 19:26:24 +0000347 self.assertIsInstance(e.__context__, AttributeError)
Amaury Forgeot d'Arcdb26f7c2008-08-29 07:13:32 +0000348
349 with support.captured_output("stderr"):
350 f()
Collin Winter828f04a2007-08-31 00:04:24 +0000351
352class TestRemovedFunctionality(unittest.TestCase):
353 def test_tuples(self):
354 try:
355 raise (IndexError, KeyError) # This should be a tuple!
356 except TypeError:
357 pass
358 else:
359 self.fail("No exception raised")
360
361 def test_strings(self):
362 try:
363 raise "foo"
364 except TypeError:
365 pass
366 else:
367 self.fail("No exception raised")
368
369
370def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000371 support.run_unittest(__name__)
Collin Winter828f04a2007-08-31 00:04:24 +0000372
Collin Winter828f04a2007-08-31 00:04:24 +0000373if __name__ == "__main__":
374 unittest.main()