=== Lib/test/test_ast.py ================================================================== --- Lib/test/test_ast.py (revision 980) +++ Lib/test/test_ast.py (local) @@ -37,7 +37,7 @@ # If "if v:pass", # Raise - "raise Exception, 'string'", + "raise Exception('string')", # TryExcept "try:\n pass\nexcept Exception:\n pass", # TryFinally @@ -160,7 +160,7 @@ ('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]), ('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]), ('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]), -('Module', [('Raise', (1, 0), ('Name', (1, 6), 'Exception', ('Load',)), ('Str', (1, 17), 'string'), None)]), +('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]), ('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('excepthandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))], 3, 0)], [])]), ('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]), ('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]), === Lib/test/test_exceptions.py ================================================================== --- Lib/test/test_exceptions.py (revision 980) +++ Lib/test/test_exceptions.py (local) @@ -13,7 +13,7 @@ def raise_catch(self, exc, excname): try: - raise exc, "spam" + raise exc("spam") except exc as err: buf1 = str(err) try: @@ -141,7 +141,7 @@ class BadException(Exception): def __init__(self_): - raise RuntimeError, "can't instantiate BadException" + raise RuntimeError("can't instantiate BadException") class InvalidException: pass @@ -305,6 +305,62 @@ 'pickled "%r", attribute "%s' % (e, checkArgName)) + def testWithTraceback(self): + try: + raise IndexError(4) + except: + tb = sys.exc_info()[2] + + e = BaseException().with_traceback(tb) + self.failUnless(isinstance(e, BaseException)) + self.assertEqual(e.__traceback__, tb) + + e = IndexError(5).with_traceback(tb) + self.failUnless(isinstance(e, IndexError)) + self.assertEqual(e.__traceback__, tb) + + class MyException(Exception): + pass + + e = MyException().with_traceback(tb) + self.failUnless(isinstance(e, MyException)) + self.assertEqual(e.__traceback__, tb) + + def testInvalidTraceback(self): + try: + Exception().__traceback__ = 5 + except TypeError as e: + self.failUnless("__traceback__ must be a traceback" in str(e)) + else: + self.fail("No exception raised") + + def testNoneClearsTracebackAttr(self): + try: + raise IndexError(4) + except: + tb = sys.exc_info()[2] + + e = Exception() + e.__traceback__ = tb + e.__traceback__ = None + self.assertEqual(e.__traceback__, None) + + def testChainingAttrs(self): + e = Exception() + self.assertEqual(e.__context__, None) + self.assertEqual(e.__cause__, None) + + e = TypeError() + self.assertEqual(e.__context__, None) + self.assertEqual(e.__cause__, None) + + class MyException(EnvironmentError): + pass + + e = MyException() + self.assertEqual(e.__context__, None) + self.assertEqual(e.__cause__, None) + def testKeywordArgs(self): # test that builtin exception don't take keyword args, # but user-defined subclasses can if they want === Lib/test/test_grammar.py ================================================================== --- Lib/test/test_grammar.py (revision 980) +++ Lib/test/test_grammar.py (local) @@ -438,7 +438,7 @@ def testRaise(self): # 'raise' test [',' test] - try: raise RuntimeError, 'just testing' + try: raise RuntimeError('just testing') except RuntimeError: pass try: raise KeyboardInterrupt except KeyboardInterrupt: pass === Lib/test/test_opcodes.py ================================================================== --- Lib/test/test_opcodes.py (revision 980) +++ Lib/test/test_opcodes.py (local) @@ -46,14 +46,10 @@ a = AClass() b = BClass() - try: raise AClass, b - except BClass as v: - if v != b: self.fail("v!=b") - else: self.fail("no exception") - - try: raise b + try: + raise b except AClass as v: - if v != b: self.fail("v!=b AClass") + self.assertEqual(v, b) else: self.fail("no exception") @@ -62,7 +58,7 @@ ##except TypeError: pass ##else: self.fail("no exception") - try: raise DClass, a + try: raise DClass(a) except DClass as v: self.assert_(isinstance(v, DClass)) else: === Lib/test/test_raise.py ================================================================== --- Lib/test/test_raise.py (revision 980) +++ Lib/test/test_raise.py (local) @@ -0,0 +1,139 @@ +# Copyright 2007 Google, Inc. All Rights Reserved. +# Licensed to PSF under a Contributor Agreement. + +"""Tests for the raise statement.""" + +from test import test_support +import sys +import types +import unittest + + +def get_tb(): + try: + raise OSError() + except: + return sys.exc_info()[2] + + +class TestRaise(unittest.TestCase): + def test_invalid_reraise(self): + try: + raise + except RuntimeError as e: + self.failUnless("No active exception" in str(e)) + else: + self.fail("No exception raised") + + def test_reraise(self): + try: + try: + raise IndexError() + except IndexError as e: + exc1 = e + raise + except IndexError as exc2: + self.failUnless(exc1 is exc2) + else: + self.fail("No exception raised") + + +class TestCause(unittest.TestCase): + def test_invalid_cause(self): + try: + raise IndexError from 5 + except TypeError as e: + self.failUnless("exception cause" in str(e)) + else: + self.fail("No exception raised") + + def test_class_cause(self): + try: + raise IndexError from KeyError + except IndexError as e: + self.failUnless(isinstance(e.__cause__, KeyError)) + else: + self.fail("No exception raised") + + def test_instance_cause(self): + cause = KeyError() + try: + raise IndexError from cause + except IndexError as e: + self.failUnless(e.__cause__ is cause) + else: + self.fail("No exception raised") + + +class TestTraceback(unittest.TestCase): + def test_sets_traceback(self): + try: + raise IndexError() + except IndexError as e: + self.failUnless(isinstance(e.__traceback__, types.TracebackType)) + else: + self.fail("No exception raised") + + def test_accepts_traceback(self): + tb = get_tb() + try: + raise IndexError().with_traceback(tb) + except IndexError as e: + self.assertNotEqual(e.__traceback__, tb) + self.assertEqual(e.__traceback__.tb_next, tb) + else: + self.fail("No exception raised") + + +# Disabled until context is implemented +# class TestContext(object): +# def test_instance_context_bare_raise(self): +# context = IndexError() +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertEqual(e.__context__, context) +# else: +# self.fail("No exception raised") +# +# def test_class_context_bare_raise(self): +# context = IndexError +# try: +# try: +# raise context +# except: +# raise OSError() +# except OSError as e: +# self.assertNotEqual(e.__context__, context) +# self.failUnless(isinstance(e.__context__, context)) +# else: +# self.fail("No exception raised") + + +class TestRemovedFunctionality(unittest.TestCase): + def test_tuples(self): + try: + raise (IndexError, KeyError) # This should be a tuple! + except TypeError: + pass + else: + self.fail("No exception raised") + + def test_strings(self): + try: + raise "foo" + except TypeError: + pass + else: + self.fail("No exception raised") + + +def test_main(): + test_support.run_unittest(__name__) + + +if __name__ == "__main__": + unittest.main() === Lib/test/test_syntax.py ================================================================== --- Lib/test/test_syntax.py (revision 980) +++ Lib/test/test_syntax.py (local) @@ -460,6 +460,16 @@ ... SyntaxError: can't assign to function call +Make sure that the old "raise X, Y[, Z]" form is gone: + >>> raise X, Y + Traceback (most recent call last): + ... + SyntaxError: invalid syntax + >>> raise X, Y, Z + Traceback (most recent call last): + ... + SyntaxError: invalid syntax + """ import re