SF patch 1631942 by Collin Winter:
(a) "except E, V" -> "except E as V"
(b) V is now limited to a simple name (local variable)
(c) V is now deleted at the end of the except block
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 30c1e7c..0f1386e 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -585,7 +585,7 @@
         badpickle = pickle.PROTO + chr(oob) + build_none
         try:
             self.loads(badpickle)
-        except ValueError, detail:
+        except ValueError as detail:
             self.failUnless(str(detail).startswith(
                                             "unsupported pickle protocol"))
         else:
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 8c0f2e4..ce39649 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -211,7 +211,7 @@
                                     'coverdir=', 'nocoverdir', 'runleaks',
                                     'huntrleaks=', 'verbose2', 'memlimit=',
                                     ])
-    except getopt.error, msg:
+    except getopt.error as msg:
         usage(2, msg)
 
     # Defaults
@@ -556,19 +556,19 @@
                 dash_R(the_module, test, indirect_test, huntrleaks)
         finally:
             sys.stdout = save_stdout
-    except test_support.ResourceDenied, msg:
+    except test_support.ResourceDenied as msg:
         if not quiet:
             print test, "skipped --", msg
             sys.stdout.flush()
         return -2
-    except (ImportError, test_support.TestSkipped), msg:
+    except (ImportError, test_support.TestSkipped) as msg:
         if not quiet:
             print test, "skipped --", msg
             sys.stdout.flush()
         return -1
     except KeyboardInterrupt:
         raise
-    except test_support.TestFailed, msg:
+    except test_support.TestFailed as msg:
         print "test", test, "failed --", msg
         sys.stdout.flush()
         return 0
@@ -640,7 +640,7 @@
             print "%r left behind %s %r" % (testname, kind, name)
         try:
             nuker(name)
-        except Exception, msg:
+        except Exception as msg:
             print >> sys.stderr, ("%r left behind %s %r and it couldn't be "
                 "removed: %s" % (testname, kind, name, msg))
 
diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
index cc83ee4..3c95b89 100644
--- a/Lib/test/sortperf.py
+++ b/Lib/test/sortperf.py
@@ -37,7 +37,7 @@
                         os.unlink(fn)
                     except os.error:
                         pass
-        except IOError, msg:
+        except IOError as msg:
             print "can't write", fn, ":", msg
     else:
         result = marshal.load(fp)
diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py
index 1aa68de..2116ea4 100644
--- a/Lib/test/string_tests.py
+++ b/Lib/test/string_tests.py
@@ -970,7 +970,7 @@
             def f():
                 yield 4 + ""
             self.fixtype(' ').join(f())
-        except TypeError, e:
+        except TypeError as e:
             if '+' not in str(e):
                 self.fail('join() ate exception message')
         else:
diff --git a/Lib/test/test_bool.py b/Lib/test/test_bool.py
index 8121e03..954423f 100644
--- a/Lib/test/test_bool.py
+++ b/Lib/test/test_bool.py
@@ -373,13 +373,11 @@
                     return badval
             try:
                 bool(A())
-            except (Exception), e_bool:
-                pass
-            try:
-                len(A())
-            except (Exception), e_len:
-                pass
-            self.assertEqual(str(e_bool), str(e_len))
+            except (Exception) as e_bool:
+                try:
+                    len(A())
+                except (Exception) as e_len:
+                    self.assertEqual(str(e_bool), str(e_len))
 
 def test_main():
     test_support.run_unittest(BoolTest)
diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py
index 3979f15..1b288b4 100644
--- a/Lib/test/test_cfgparser.py
+++ b/Lib/test/test_cfgparser.py
@@ -181,7 +181,7 @@
     def get_error(self, exc, section, option):
         try:
             self.cf.get(section, option)
-        except exc, e:
+        except exc as e:
             return e
         else:
             self.fail("expected exception type %s.%s"
diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py
index 52e5e91..9cf6a12 100644
--- a/Lib/test/test_cgi.py
+++ b/Lib/test/test_cgi.py
@@ -50,7 +50,7 @@
         raise ValueError, "unknown method: %s" % method
     try:
         return cgi.parse(fp, env, strict_parsing=1)
-    except StandardError, err:
+    except StandardError as err:
         return ComparableException(err)
 
 # A list of test cases.  Each test case is a a two-tuple that contains
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index 3201dd8..1758fd4 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -372,7 +372,7 @@
     a = property(booh)
 try:
     A().a # Raised AttributeError: A instance has no attribute 'a'
-except AttributeError, x:
+except AttributeError as x:
     if str(x) != "booh":
         print "attribute error for A().a got masked:", str(x)
 
@@ -384,7 +384,7 @@
     __init__ = property(booh)
 try:
     I() # In debug mode, printed XXX undetected error and raises AttributeError
-except AttributeError, x:
+except AttributeError as x:
     pass
 else:
     print "attribute error for I.__init__ got masked"
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index 3c800f8..0711923 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -595,7 +595,7 @@
         if sys.maxunicode > 0xffff:
             try:
                 "\x00\x00\x00\x00\x00\x11\x11\x00".decode("unicode_internal")
-            except UnicodeDecodeError, ex:
+            except UnicodeDecodeError as ex:
                 self.assertEquals("unicode_internal", ex.encoding)
                 self.assertEquals("\x00\x00\x00\x00\x00\x11\x11\x00", ex.object)
                 self.assertEquals(4, ex.start)
@@ -782,7 +782,7 @@
                 prepped = unicode(prepped, "utf-8")
                 try:
                     self.assertEquals(nameprep(orig), prepped)
-                except Exception,e:
+                except Exception as e:
                     raise test_support.TestFailed("Test 3.%d: %s" % (pos+1, str(e)))
 
 class IDNACodecTest(unittest.TestCase):
diff --git a/Lib/test/test_compiler.py b/Lib/test/test_compiler.py
index 2ecd093..ebccb36 100644
--- a/Lib/test/test_compiler.py
+++ b/Lib/test/test_compiler.py
@@ -44,7 +44,7 @@
                 else:
                     try:
                         compiler.compile(buf, basename, "exec")
-                    except Exception, e:
+                    except Exception as e:
                         args = list(e.args)
                         args[0] += "[in file %s]" % basename
                         e.args = tuple(args)
diff --git a/Lib/test/test_contextlib.py b/Lib/test/test_contextlib.py
index 747785d..9142428 100644
--- a/Lib/test/test_contextlib.py
+++ b/Lib/test/test_contextlib.py
@@ -76,7 +76,7 @@
             state.append(1)
             try:
                 yield 42
-            except ZeroDivisionError, e:
+            except ZeroDivisionError as e:
                 state.append(e.args[0])
                 self.assertEqual(state, [1, 42, 999])
         with woohoo() as x:
diff --git a/Lib/test/test_cookielib.py b/Lib/test/test_cookielib.py
index 544f29f..9b06869 100644
--- a/Lib/test/test_cookielib.py
+++ b/Lib/test/test_cookielib.py
@@ -257,7 +257,7 @@
             try:
                 c.load(filename="for this test to work, a file with this "
                                 "filename should not exist")
-            except IOError, exc:
+            except IOError as exc:
                 # exactly IOError, not LoadError
                 self.assertEqual(exc.__class__, IOError)
             else:
diff --git a/Lib/test/test_dbm.py b/Lib/test/test_dbm.py
index ed92bfe..0a9db4e 100755
--- a/Lib/test/test_dbm.py
+++ b/Lib/test/test_dbm.py
@@ -16,7 +16,8 @@
     for suffix in ['', '.pag', '.dir', '.db']:
         try:
             os.unlink(filename + suffix)
-        except OSError, (errno, strerror):
+        except OSError as e:
+            (errno, strerror) = e
             # if we can't delete the file because of permissions,
             # nothing will work, so skip the test
             if errno == 1:
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 50df93d..f9a9e82 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -146,7 +146,7 @@
                 print 'Error in test cases:'
                 print line
                 continue
-            except DecimalException, exception:
+            except DecimalException as exception:
                 #Exception raised where there shoudn't have been one.
                 self.fail('Exception "'+exception.__class__.__name__ + '" raised on line '+line)
 
@@ -238,7 +238,7 @@
                             funct(self.context.create_decimal(v))
                         except error:
                             pass
-                        except Signals, e:
+                        except Signals as e:
                             self.fail("Raised %s in %s when %s disabled" % \
                                       (e, s, error))
                         else:
@@ -258,7 +258,7 @@
                     funct(*vals)
                 except error:
                     pass
-                except Signals, e:
+                except Signals as e:
                     self.fail("Raised %s in %s when %s disabled" % \
                               (e, s, error))
                 else:
@@ -268,7 +268,7 @@
             result = str(funct(*vals))
             if fname == 'same_quantum':
                 result = str(int(eval(result))) # 'True', 'False' -> '1', '0'
-        except Signals, error:
+        except Signals as error:
             self.fail("Raised %s in %s" % (error, s))
         except: #Catch any error long enough to state the test case.
             print "ERROR:", s
diff --git a/Lib/test/test_defaultdict.py b/Lib/test/test_defaultdict.py
index 134b5a8..602e0d9 100644
--- a/Lib/test/test_defaultdict.py
+++ b/Lib/test/test_defaultdict.py
@@ -43,7 +43,7 @@
         self.assertEqual(d2.default_factory, None)
         try:
             d2[15]
-        except KeyError, err:
+        except KeyError as err:
             self.assertEqual(err.args, (15,))
         else:
             self.fail("d2[15] didn't raise KeyError")
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 2968e3d..96ff9f3 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -945,7 +945,7 @@
     def raises(exc, expected, callable, *args):
         try:
             callable(*args)
-        except exc, msg:
+        except exc as msg:
             if not str(msg).startswith(expected):
                 raise TestFailed, "Message %r, expected %r" % (str(msg),
                                                                expected)
@@ -1813,7 +1813,7 @@
     no = NoWeak()
     try:
         weakref.ref(no)
-    except TypeError, msg:
+    except TypeError as msg:
         verify(str(msg).find("weak reference") >= 0)
     else:
         verify(0, "weakref.ref(no) should be illegal")
@@ -1866,7 +1866,7 @@
     for attr in "__doc__", "fget", "fset", "fdel":
         try:
             setattr(raw, attr, 42)
-        except TypeError, msg:
+        except TypeError as msg:
             if str(msg).find('readonly') < 0:
                 raise TestFailed("when setting readonly attr %r on a "
                                  "property, got unexpected TypeError "
@@ -2416,7 +2416,7 @@
         for code in code1, code2, code3:
             try:
                 sandbox.r_exec(code)
-            except IOError, msg:
+            except IOError as msg:
                 if str(msg).find("restricted") >= 0:
                     outcome = "OK"
                 else:
@@ -3523,7 +3523,7 @@
 
     try:
         D.__bases__ = ()
-    except TypeError, msg:
+    except TypeError as msg:
         if str(msg) == "a new-style class can't have only classic bases":
             raise TestFailed, "wrong error message for .__bases__ = ()"
     else:
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index ff6ccde..c7fa15d 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -414,7 +414,7 @@
         e = E()
         try:
             e[42]
-        except RuntimeError, err:
+        except RuntimeError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("e[42] didn't raise RuntimeError")
@@ -425,7 +425,7 @@
         f = F()
         try:
             f[42]
-        except KeyError, err:
+        except KeyError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("f[42] didn't raise KeyError")
@@ -434,7 +434,7 @@
         g = G()
         try:
             g[42]
-        except KeyError, err:
+        except KeyError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("g[42] didn't raise KeyError")
@@ -444,7 +444,7 @@
         d = {}
         try:
             d[(1,)]
-        except KeyError, e:
+        except KeyError as e:
             self.assertEqual(e.args, ((1,),))
         else:
             self.fail("missing KeyError")
diff --git a/Lib/test/test_dl.py b/Lib/test/test_dl.py
index b70a4cf..9c70427 100755
--- a/Lib/test/test_dl.py
+++ b/Lib/test/test_dl.py
@@ -18,7 +18,7 @@
         if verbose:
             print 'trying to open:', s,
         l = dl.open(s)
-    except dl.error, err:
+    except dl.error as err:
         if verbose:
             print 'failed', repr(str(err))
         pass
diff --git a/Lib/test/test_eof.py b/Lib/test/test_eof.py
index aae3518..1187d07 100644
--- a/Lib/test/test_eof.py
+++ b/Lib/test/test_eof.py
@@ -11,7 +11,7 @@
         try:
             eval("""'this is a test\
             """)
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(str(msg), expect)
         else:
             raise test_support.TestFailed
@@ -20,7 +20,7 @@
         expect = "EOF while scanning triple-quoted string (<string>, line 1)"
         try:
             eval("""'''this is a test""")
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(str(msg), expect)
         else:
             raise test_support.TestFailed
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 7619aae..4a6b8c5 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -21,17 +21,17 @@
         try:
             import exceptions
             reload(exceptions)
-        except ImportError, e:
+        except ImportError as e:
             self.fail("reloading exceptions: %s" % e)
 
     def raise_catch(self, exc, excname):
         try:
             raise exc, "spam"
-        except exc, err:
+        except exc as err:
             buf1 = str(err)
         try:
             raise exc("spam")
-        except exc, err:
+        except exc as err:
             buf2 = str(err)
         self.assertEquals(buf1, buf2)
         self.assertEquals(exc.__name__, excname)
@@ -115,7 +115,7 @@
 
         self.raise_catch(Exception, "Exception")
         try: x = 1/0
-        except Exception, e: pass
+        except Exception as e: pass
 
     def testSyntaxErrorMessage(self):
         # make sure the right exception message is raised for each of
@@ -124,7 +124,7 @@
         def ckmsg(src, msg):
             try:
                 compile(src, '<fragment>', 'exec')
-            except SyntaxError, e:
+            except SyntaxError as e:
                 if e.msg != msg:
                     self.fail("expected %s, got %s" % (msg, e.msg))
             else:
@@ -163,7 +163,7 @@
             import _testcapi
             try:
                 _testcapi.raise_exception(BadException, 1)
-            except TypeError, err:
+            except TypeError as err:
                 exc, err, tb = sys.exc_info()
                 co = tb.tb_frame.f_code
                 self.assertEquals(co.co_name, "test_capi1")
@@ -175,7 +175,7 @@
             import _testcapi
             try:
                 _testcapi.raise_exception(BadException, 0)
-            except RuntimeError, err:
+            except RuntimeError as err:
                 exc, err, tb = sys.exc_info()
                 co = tb.tb_frame.f_code
                 self.assertEquals(co.co_name, "__init__")
@@ -285,7 +285,7 @@
         for exc, args, expected in exceptionList:
             try:
                 raise exc(*args)
-            except BaseException, e:
+            except BaseException as e:
                 if type(e) is not exc:
                     raise
                 # Verify module name
@@ -344,6 +344,16 @@
         self.failUnless(str(Exception('a')))
         self.failUnless(unicode(Exception(u'a')))
 
+    def testExceptionCleanup(self):
+        # Make sure "except V as N" exceptions are cleaned up properly
+        
+        try:
+            raise Exception()
+        except Exception as e:
+            self.failUnless(e)
+            del e
+        self.failIf('e' in locals())
+
 
 def test_main():
     run_unittest(ExceptionTests)
diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py
index 284dbb2..11cf43a 100644
--- a/Lib/test/test_extcall.py
+++ b/Lib/test/test_extcall.py
@@ -35,21 +35,21 @@
 
 try:
     g()
-except TypeError, err:
+except TypeError as err:
     print "TypeError:", err
 else:
     print "should raise TypeError: not enough arguments; expected 1, got 0"
 
 try:
     g(*())
-except TypeError, err:
+except TypeError as err:
     print "TypeError:", err
 else:
     print "should raise TypeError: not enough arguments; expected 1, got 0"
 
 try:
     g(*(), **{})
-except TypeError, err:
+except TypeError as err:
     print "TypeError:", err
 else:
     print "should raise TypeError: not enough arguments; expected 1, got 0"
@@ -61,7 +61,7 @@
 class Nothing: pass
 try:
     g(*Nothing())
-except TypeError, attr:
+except TypeError as attr:
     pass
 else:
     print "should raise TypeError"
@@ -71,7 +71,7 @@
         return 5
 try:
     g(*Nothing())
-except TypeError, attr:
+except TypeError as attr:
     pass
 else:
     print "should raise TypeError"
@@ -93,7 +93,7 @@
         return self
 try:
     g(*Nothing())
-except TypeError, attr:
+except TypeError as attr:
     pass
 else:
     print "should raise TypeError"
@@ -132,77 +132,77 @@
 
 try:
     g(1, 2, 3, **{'x':4, 'y':5})
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: keyword parameter redefined"
 
 try:
     g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9})
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: keyword parameter redefined"
 
 try:
     f(**{1:2})
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: keywords must be strings"
 
 try:
     h(**{'e': 2})
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: unexpected keyword argument: e"
 
 try:
     h(*h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: * argument must be a tuple"
 
 try:
     dir(*h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: * argument must be a tuple"
 
 try:
     None(*h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: * argument must be a tuple"
 
 try:
     h(**h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: ** argument must be a dictionary"
 
 try:
     dir(**h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: ** argument must be a dictionary"
 
 try:
     None(**h)
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: ** argument must be a dictionary"
 
 try:
     dir(b=1,**{'b':1})
-except TypeError, err:
+except TypeError as err:
     print err
 else:
     print "should raise TypeError: dir() got multiple values for keyword argument 'b'"
@@ -226,13 +226,13 @@
 print Foo.method(x, *(1, 2))
 try:
     print Foo.method(*(1, 2, 3))
-except TypeError, err:
+except TypeError as err:
     pass
 else:
     print 'expected a TypeError for unbound method call'
 try:
     print Foo.method(1, *(2, 3))
-except TypeError, err:
+except TypeError as err:
     pass
 else:
     print 'expected a TypeError for unbound method call'
@@ -276,4 +276,4 @@
             for k in kwargs: kwdict[k] = k + k
             print func.func_name, args, sortdict(kwdict), '->',
             try: func(*args, **kwdict)
-            except TypeError, err: print err
+            except TypeError as err: print err
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
index 234920d..52c4a02 100644
--- a/Lib/test/test_file.py
+++ b/Lib/test/test_file.py
@@ -159,7 +159,7 @@
         bad_mode = "qwerty"
         try:
             f = open(TESTFN, bad_mode)
-        except ValueError, msg:
+        except ValueError as msg:
             if msg[0] != 0:
                 s = str(msg)
                 if s.find(TESTFN) != -1 or s.find(bad_mode) == -1:
@@ -183,7 +183,7 @@
                 d = int(f.read())
                 f.close()
                 f.close()
-            except IOError, msg:
+            except IOError as msg:
                 self.fail('error setting buffer size %d: %s' % (s, str(msg)))
             self.assertEquals(d, s)
 
diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py
index 8bf5d6e..ace3bc9 100644
--- a/Lib/test/test_format.py
+++ b/Lib/test/test_format.py
@@ -199,7 +199,7 @@
 def test_exc(formatstr, args, exception, excmsg):
     try:
         testformat(formatstr, args)
-    except exception, exc:
+    except exception as exc:
         if str(exc) == excmsg:
             if verbose:
                 print "yes"
diff --git a/Lib/test/test_frozen.py b/Lib/test/test_frozen.py
index 673799d..678b9a8 100644
--- a/Lib/test/test_frozen.py
+++ b/Lib/test/test_frozen.py
@@ -12,17 +12,17 @@
 
 try:
     import __hello__
-except ImportError, x:
+except ImportError as x:
     raise TestFailed, "import __hello__ failed:" + str(x)
 
 try:
     import __phello__
-except ImportError, x:
+except ImportError as x:
     raise TestFailed, "import __phello__ failed:" + str(x)
 
 try:
     import __phello__.spam
-except ImportError, x:
+except ImportError as x:
     raise TestFailed, "import __phello__.spam failed:" + str(x)
 
 if sys.platform != "mac":  # On the Mac this import does succeed.
diff --git a/Lib/test/test_future.py b/Lib/test/test_future.py
index 9a5f829..1437489 100644
--- a/Lib/test/test_future.py
+++ b/Lib/test/test_future.py
@@ -29,7 +29,7 @@
     def test_badfuture3(self):
         try:
             from test import badsyntax_future3
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future3", '3'))
         else:
             self.fail("expected exception didn't occur")
@@ -37,7 +37,7 @@
     def test_badfuture4(self):
         try:
             from test import badsyntax_future4
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future4", '3'))
         else:
             self.fail("expected exception didn't occur")
@@ -45,7 +45,7 @@
     def test_badfuture5(self):
         try:
             from test import badsyntax_future5
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future5", '4'))
         else:
             self.fail("expected exception didn't occur")
@@ -53,7 +53,7 @@
     def test_badfuture6(self):
         try:
             from test import badsyntax_future6
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future6", '3'))
         else:
             self.fail("expected exception didn't occur")
@@ -61,7 +61,7 @@
     def test_badfuture7(self):
         try:
             from test import badsyntax_future7
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future7", '3'))
         else:
             self.fail("expected exception didn't occur")
@@ -69,7 +69,7 @@
     def test_badfuture8(self):
         try:
             from test import badsyntax_future8
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future8", '3'))
         else:
             self.fail("expected exception didn't occur")
@@ -77,7 +77,7 @@
     def test_badfuture9(self):
         try:
             from test import badsyntax_future9
-        except SyntaxError, msg:
+        except SyntaxError as msg:
             self.assertEqual(get_error_location(msg), ("badsyntax_future9", '3'))
         else:
             self.fail("expected exception didn't occur")
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 2ffd2f8..30df034 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -1554,7 +1554,7 @@
 ...     while True:
 ...         try:
 ...             print (yield)
-...         except ValueError,v:
+...         except ValueError as v:
 ...             print "caught ValueError (%s)" % (v),
 >>> import sys
 >>> g = f()
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 34c550e..0d36a62 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -554,7 +554,7 @@
         assert 1, lambda x:x+1
         try:
             assert 0, "msg"
-        except AssertionError, e:
+        except AssertionError as e:
             self.assertEquals(e.args[0], "msg")
         else:
             if __debug__:
@@ -612,7 +612,7 @@
     def testTry(self):
         ### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
         ###         | 'try' ':' suite 'finally' ':' suite
-        ### except_clause: 'except' [expr [',' expr]]
+        ### except_clause: 'except' [expr ['as' expr]]
         try:
             1/0
         except ZeroDivisionError:
@@ -621,14 +621,14 @@
             pass
         try: 1/0
         except EOFError: pass
-        except TypeError, msg: pass
-        except RuntimeError, msg: pass
+        except TypeError as msg: pass
+        except RuntimeError as msg: pass
         except: pass
         else: pass
         try: 1/0
         except (EOFError, TypeError, ZeroDivisionError): pass
         try: 1/0
-        except (EOFError, TypeError, ZeroDivisionError), msg: pass
+        except (EOFError, TypeError, ZeroDivisionError) as msg: pass
         try: pass
         finally: pass
 
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index 58de944..f3d1d49 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -55,7 +55,7 @@
             try:
                 try:
                     mod = __import__(TESTFN)
-                except ImportError, err:
+                except ImportError as err:
                     self.fail("import from %s failed: %s" % (ext, err))
 
                 self.assertEquals(mod.a, a,
@@ -68,7 +68,7 @@
             try:
                 try:
                     reload(mod)
-                except ImportError, err:
+                except ImportError as err:
                     self.fail("import from .pyc/.pyo failed: %s" % err)
             finally:
                 try:
diff --git a/Lib/test/test_linuxaudiodev.py b/Lib/test/test_linuxaudiodev.py
index fe902b5..05e4041 100644
--- a/Lib/test/test_linuxaudiodev.py
+++ b/Lib/test/test_linuxaudiodev.py
@@ -27,7 +27,7 @@
 
     try:
         a = linuxaudiodev.open('w')
-    except linuxaudiodev.error, msg:
+    except linuxaudiodev.error as msg:
         if msg[0] in (errno.EACCES, errno.ENOENT, errno.ENODEV, errno.EBUSY):
             raise TestSkipped, msg
         raise TestFailed, msg
@@ -62,27 +62,27 @@
     nchannels = 1
     try:
         a.setparameters(-1, size, nchannels, fmt)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
     try:
         a.setparameters(rate, -2, nchannels, fmt)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
     try:
         a.setparameters(rate, size, 3, fmt)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
     try:
         a.setparameters(rate, size, nchannels, 177)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
     try:
         a.setparameters(rate, size, nchannels, linuxaudiodev.AFMT_U16_LE)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
     try:
         a.setparameters(rate, 16, nchannels, fmt)
-    except ValueError, msg:
+    except ValueError as msg:
         print msg
 
 def test():
diff --git a/Lib/test/test_nis.py b/Lib/test/test_nis.py
index 590868f..55dd32c 100644
--- a/Lib/test/test_nis.py
+++ b/Lib/test/test_nis.py
@@ -6,7 +6,7 @@
     def test_maps(self):
         try:
             maps = nis.maps()
-        except nis.error, msg:
+        except nis.error as msg:
             # NIS is probably not active, so this test isn't useful
             if verbose:
                 self.fail("(failing because of verbose mode) %s" % msg)
diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py
index 1a2f5d6..0ee51a8 100644
--- a/Lib/test/test_opcodes.py
+++ b/Lib/test/test_opcodes.py
@@ -47,12 +47,12 @@
         b = BClass()
 
         try: raise AClass, b
-        except BClass, v:
+        except BClass as v:
             if v != b: self.fail("v!=b")
         else: self.fail("no exception")
 
         try: raise b
-        except AClass, v:
+        except AClass as v:
             if v != b: self.fail("v!=b AClass")
         else:
             self.fail("no exception")
@@ -63,7 +63,7 @@
         ##else: self.fail("no exception")
 
         try:  raise DClass, a
-        except DClass, v:
+        except DClass as v:
             self.assert_(isinstance(v, DClass))
         else:
             self.fail("no exception")
diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py
index 4582fa7..1c4970f 100644
--- a/Lib/test/test_optparse.py
+++ b/Lib/test/test_optparse.py
@@ -114,7 +114,7 @@
 
         try:
             func(*args, **kwargs)
-        except expected_exception, err:
+        except expected_exception as err:
             actual_message = str(err)
             if isinstance(expected_message, retype):
                 self.assert_(expected_message.search(actual_message),
@@ -152,7 +152,7 @@
         """
         try:
             self.parser.parse_args(cmdline_args)
-        except InterceptedError, err:
+        except InterceptedError as err:
             self.assertEqual(err.error_message, expected_output)
         else:
             self.assertFalse("expected parse failure")
@@ -175,7 +175,7 @@
                 output = sys.stdout.getvalue()
                 sys.stdout = save_stdout
 
-        except InterceptedError, err:
+        except InterceptedError as err:
             self.assert_(
                 type(output) is types.StringType,
                 "expected output to be an ordinary string, not %r"
@@ -460,7 +460,7 @@
             return int(value)
         else:
             return int(value[:-1]) * _time_units[value[-1]]
-    except ValueError, IndexError:
+    except ValueError as IndexError:
         raise OptionValueError(
             'option %s: invalid duration: %r' % (opt, value))
 
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 1c87d06..93e530c 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -179,7 +179,7 @@
         import statvfs
         try:
             result = os.statvfs(self.fname)
-        except OSError, e:
+        except OSError as e:
             # On AtheOS, glibc always returns ENOSYS
             import errno
             if e.errno == errno.ENOSYS:
diff --git a/Lib/test/test_ossaudiodev.py b/Lib/test/test_ossaudiodev.py
index 5868ea7..0377e9c 100644
--- a/Lib/test/test_ossaudiodev.py
+++ b/Lib/test/test_ossaudiodev.py
@@ -48,7 +48,7 @@
 def play_sound_file(data, rate, ssize, nchannels):
     try:
         dsp = ossaudiodev.open('w')
-    except IOError, msg:
+    except IOError as msg:
         if msg[0] in (errno.EACCES, errno.ENOENT, errno.ENODEV, errno.EBUSY):
             raise TestSkipped, msg
         raise TestFailed, msg
@@ -142,7 +142,7 @@
         try:
             result = dsp.setparameters(fmt, channels, rate, True)
             raise AssertionError("setparameters: expected OSSAudioError")
-        except ossaudiodev.OSSAudioError, err:
+        except ossaudiodev.OSSAudioError as err:
             print "setparameters: got OSSAudioError as expected"
 
 def test():
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
index 0bf1218..36bc4e3 100644
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -15,7 +15,7 @@
         t = st1.totuple()
         try:
             st2 = parser.sequence2st(t)
-        except parser.ParserError, why:
+        except parser.ParserError as why:
             self.fail("could not roundtrip %r: %s" % (s, why))
 
         self.assertEquals(t, st2.totuple(),
diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py
index f307089..ff71bf2 100644
--- a/Lib/test/test_pep277.py
+++ b/Lib/test/test_pep277.py
@@ -50,7 +50,7 @@
             fn(filename)
             raise test_support.TestFailed("Expected to fail calling '%s(%r)'"
                              % (fn.__name__, filename))
-        except expected_exception, details:
+        except expected_exception as details:
             if check_fn_in_exception and details.filename != filename:
                 raise test_support.TestFailed("Function '%s(%r) failed with "
                                  "bad filename in the exception: %r"
diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py
index 0698818..73092c1 100644
--- a/Lib/test/test_pyexpat.py
+++ b/Lib/test/test_pyexpat.py
@@ -177,7 +177,7 @@
 print "Legal values tested o.k."
 try:
     expat.ParserCreate(namespace_separator=42)
-except TypeError, e:
+except TypeError as e:
     print "Caught expected TypeError:"
     print e
 else:
@@ -185,7 +185,7 @@
 
 try:
     expat.ParserCreate(namespace_separator='too long')
-except ValueError, e:
+except ValueError as e:
     print "Caught expected ValueError:"
     print e
 else:
@@ -321,7 +321,7 @@
 
 try:
     parser.Parse("<a><b><c/></b></a>", 1)
-except RuntimeError, e:
+except RuntimeError as e:
     if e.args[0] != "a":
         print "Expected RuntimeError for element 'a'; found %r" % e.args[0]
 else:
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 02f4dca..dafd82e 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -633,7 +633,7 @@
         else:
             try:
                 result = obj.search(s)
-            except re.error, msg:
+            except re.error as msg:
                 print '=== Unexpected exception', t, repr(msg)
             if outcome == SYNTAX_ERROR:
                 # This should have been a syntax error; forget it.
diff --git a/Lib/test/test_runpy.py b/Lib/test/test_runpy.py
index 88e9900..a37ee7b 100644
--- a/Lib/test/test_runpy.py
+++ b/Lib/test/test_runpy.py
@@ -117,7 +117,7 @@
             entry = parts[0]
             try:
                 del sys.modules[entry]
-            except KeyError, ex:
+            except KeyError as ex:
                 if verbose: print ex # Persist with cleaning up
         if verbose: print "  Removed sys.modules entries"
         del sys.path[0]
@@ -126,18 +126,18 @@
             for name in files:
                 try:
                     os.remove(os.path.join(root, name))
-                except OSError, ex:
+                except OSError as ex:
                     if verbose: print ex # Persist with cleaning up
             for name in dirs:
                 fullname = os.path.join(root, name)
                 try:
                     os.rmdir(fullname)
-                except OSError, ex:
+                except OSError as ex:
                     if verbose: print ex # Persist with cleaning up
         try:
             os.rmdir(top)
             if verbose: print "  Removed package tree"
-        except OSError, ex:
+        except OSError as ex:
             if verbose: print ex # Persist with cleaning up
 
     def _check_module(self, depth):
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
index 83ffcf1..d3939c0 100644
--- a/Lib/test/test_sax.py
+++ b/Lib/test/test_sax.py
@@ -479,7 +479,7 @@
     source.setSystemId(name)
     try:
         parser.parse(source)
-    except SAXException, e:
+    except SAXException as e:
         return e.getSystemId() == name
 
 def test_expat_incomplete():
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index 9bd0d43..0d08b79 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -332,7 +332,7 @@
         for v1 in ['Q', (1,)]:
             try:
                 self.s.remove(v1)
-            except KeyError, e:
+            except KeyError as e:
                 v2 = e.args[0]
                 self.assertEqual(v1, v2)
             else:
diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py
index df37f73..e141257 100644
--- a/Lib/test/test_socket.py
+++ b/Lib/test/test_socket.py
@@ -129,7 +129,7 @@
             raise TypeError, "test_func must be a callable function"
         try:
             test_func()
-        except Exception, strerror:
+        except Exception as strerror:
             self.queue.put(strerror)
         self.clientTearDown()
 
diff --git a/Lib/test/test_socket_ssl.py b/Lib/test/test_socket_ssl.py
index 3c9c9f0..5d308c5 100644
--- a/Lib/test/test_socket_ssl.py
+++ b/Lib/test/test_socket_ssl.py
@@ -58,7 +58,7 @@
     except socket.timeout:
         error_msg('timed out')
         return
-    except socket.error, exc:  # In case connection is refused.
+    except socket.error as exc:  # In case connection is refused.
         if exc.args[0] == errno.ECONNREFUSED:
             error_msg('was refused')
             return
diff --git a/Lib/test/test_socketserver.py b/Lib/test/test_socketserver.py
index e4cbb2b..202f2da 100644
--- a/Lib/test/test_socketserver.py
+++ b/Lib/test/test_socketserver.py
@@ -155,7 +155,8 @@
                 self.server_address = host, port
                 TCPServer.server_bind(self)
                 break
-            except socket.error, (err, msg):
+            except socket.error as e:
+                (err, msg) = e
                 if err != errno.EADDRINUSE:
                     raise
                 print >>sys.__stderr__, \
diff --git a/Lib/test/test_strftime.py b/Lib/test/test_strftime.py
index e9d3826..00fa227 100755
--- a/Lib/test/test_strftime.py
+++ b/Lib/test/test_strftime.py
@@ -119,7 +119,7 @@
     for e in expectations:
         try:
             result = time.strftime(e[0], now)
-        except ValueError, error:
+        except ValueError as error:
             print "Standard '%s' format gave error:" % e[0], error
             continue
         if re.match(escapestr(e[1], ampm), result): continue
@@ -132,7 +132,7 @@
     for e in nonstandard_expectations:
         try:
             result = time.strftime(e[0], now)
-        except ValueError, result:
+        except ValueError as result:
             if verbose:
                 print "Error for nonstandard '%s' format (%s): %s" % \
                       (e[0], e[2], str(result))
diff --git a/Lib/test/test_string.py b/Lib/test/test_string.py
index fdd431d..6d5e8e4 100644
--- a/Lib/test/test_string.py
+++ b/Lib/test/test_string.py
@@ -55,7 +55,7 @@
             def f():
                 yield 4 + ""
             self.fixtype(' ').join(f())
-        except TypeError, e:
+        except TypeError as e:
             if '+' not in str(e):
                 self.fail('join() ate exception message')
         else:
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
index ba65649..df94f7b 100644
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -206,7 +206,7 @@
                 _strptime.strptime("2005", bad_format)
             except ValueError:
                 continue
-            except Exception, err:
+            except Exception as err:
                 self.fail("'%s' raised %s, not ValueError" %
                             (bad_format, err.__class__.__name__))
             else:
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 64f8d40..fcc0f45 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -67,7 +67,7 @@
         try:
             subprocess.check_call([sys.executable, "-c",
                                    "import sys; sys.exit(47)"])
-        except subprocess.CalledProcessError, e:
+        except subprocess.CalledProcessError as e:
             self.assertEqual(e.returncode, 47)
         else:
             self.fail("Expected CalledProcessError")
@@ -475,7 +475,7 @@
             try:
                 p = subprocess.Popen([sys.executable, "-c", ""],
                                  cwd="/this/path/does/not/exist")
-            except OSError, e:
+            except OSError as e:
                 # The attribute child_traceback should contain "os.chdir"
                 # somewhere.
                 self.assertNotEqual(e.child_traceback.find("os.chdir"), -1)
diff --git a/Lib/test/test_sunaudiodev.py b/Lib/test/test_sunaudiodev.py
index f203d9a..0427db5 100644
--- a/Lib/test/test_sunaudiodev.py
+++ b/Lib/test/test_sunaudiodev.py
@@ -16,7 +16,7 @@
     fp.close()
     try:
         a = sunaudiodev.open('w')
-    except sunaudiodev.error, msg:
+    except sunaudiodev.error as msg:
         raise TestFailed, msg
     else:
         a.write(data)
diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py
index 2c19698..6115800 100644
--- a/Lib/test/test_support.py
+++ b/Lib/test/test_support.py
@@ -102,7 +102,8 @@
         try:
             sock.bind((host, port))
             return port
-        except socket.error, (err, msg):
+        except socket.error as e:
+            (err, msg) = e
             if err != errno.EADDRINUSE:
                 raise
             print >>sys.__stderr__, \
diff --git a/Lib/test/test_syntax.py b/Lib/test/test_syntax.py
index a0eaac6..2c7315d 100644
--- a/Lib/test/test_syntax.py
+++ b/Lib/test/test_syntax.py
@@ -387,7 +387,7 @@
         """
         try:
             compile(code, filename, mode)
-        except SyntaxError, err:
+        except SyntaxError as err:
             if subclass and not isinstance(err, subclass):
                 self.fail("SyntaxError is not a %s" % subclass.__name__)
             mo = re.search(errtext, str(err))
diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index fdeb500..897c6b0 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -54,7 +54,7 @@
         self.assertRaises(TypeError, eh)
         try:
             raise ValueError(42)
-        except ValueError, exc:
+        except ValueError as exc:
             eh(*sys.exc_info())
 
         sys.stderr = savestderr
@@ -84,7 +84,7 @@
         def clear():
             try:
                 raise ValueError, 42
-            except ValueError, exc:
+            except ValueError as exc:
                 clear_check(exc)
 
         # Raise an exception and check that it can be cleared
@@ -94,7 +94,7 @@
         # unaffected by calling exc_clear in a nested frame.
         try:
             raise ValueError, 13
-        except ValueError, exc:
+        except ValueError as exc:
             typ1, value1, traceback1 = sys.exc_info()
             clear()
             typ2, value2, traceback2 = sys.exc_info()
@@ -104,16 +104,13 @@
             self.assert_(value1 is value2)
             self.assert_(traceback1 is traceback2)
 
-        # Check that an exception can be cleared outside of an except block
-        clear_check(exc)
-
     def test_exit(self):
         self.assertRaises(TypeError, sys.exit, 42, 42)
 
         # call without argument
         try:
             sys.exit(0)
-        except SystemExit, exc:
+        except SystemExit as exc:
             self.assertEquals(exc.code, 0)
         except:
             self.fail("wrong exception")
@@ -124,7 +121,7 @@
         # entry will be unpacked
         try:
             sys.exit(42)
-        except SystemExit, exc:
+        except SystemExit as exc:
             self.assertEquals(exc.code, 42)
         except:
             self.fail("wrong exception")
@@ -134,7 +131,7 @@
         # call with integer argument
         try:
             sys.exit((42,))
-        except SystemExit, exc:
+        except SystemExit as exc:
             self.assertEquals(exc.code, 42)
         except:
             self.fail("wrong exception")
@@ -144,7 +141,7 @@
         # call with string argument
         try:
             sys.exit("exit")
-        except SystemExit, exc:
+        except SystemExit as exc:
             self.assertEquals(exc.code, "exit")
         except:
             self.fail("wrong exception")
@@ -154,7 +151,7 @@
         # call with tuple argument with two entries
         try:
             sys.exit((17, 23))
-        except SystemExit, exc:
+        except SystemExit as exc:
             self.assertEquals(exc.code, (17, 23))
         except:
             self.fail("wrong exception")
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 2b39715..9ae913d 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -545,7 +545,7 @@
         try:
             # Extract 1-LNKTYPE which is a hardlink to 0-REGTYPE
             self.tar.extract("1-LNKTYPE", dirname())
-        except EnvironmentError, e:
+        except EnvironmentError as e:
             import errno
             if e.errno == errno.ENOENT:
                 self.fail("hardlink not extracted properly")
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index fa170ef..4255d8a 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -107,7 +107,7 @@
         filename = "doesnotexists"
         try:
             os.remove(filename)
-        except Exception,e:
+        except Exception as e:
             pass
         self.assertRaises(TclError,tcl.evalfile,filename)
 
diff --git a/Lib/test/test_trace.py b/Lib/test/test_trace.py
index 08aec8e..42d1a4a 100644
--- a/Lib/test/test_trace.py
+++ b/Lib/test/test_trace.py
@@ -97,7 +97,7 @@
 def test_raise():
     try:
         raises()
-    except Exception, exc:
+    except Exception as exc:
         x = 1
 
 test_raise.events = [(0, 'call'),
@@ -127,7 +127,7 @@
 def settrace_and_raise(tracefunc):
     try:
         _settrace_and_raise(tracefunc)
-    except RuntimeError, exc:
+    except RuntimeError as exc:
         pass
 
 settrace_and_raise.events = [(2, 'exception'),
@@ -432,7 +432,7 @@
     try:
         output.append(2)
         output.append(3)
-    except ValueError, e:
+    except ValueError as e:
         output.append('after' in str(e))
 
 no_jump_too_far_forwards.jump = (3, 6)
@@ -442,7 +442,7 @@
     try:
         output.append(2)
         output.append(3)
-    except ValueError, e:
+    except ValueError as e:
         output.append('before' in str(e))
 
 no_jump_too_far_backwards.jump = (3, -1)
@@ -472,7 +472,7 @@
 def no_jump_to_except_3(output):
     try:
         output.append(2)
-    except ValueError, e:
+    except ValueError as e:
         output.append('except' in str(e))
 
 no_jump_to_except_3.jump = (2, 3)
@@ -481,7 +481,7 @@
 def no_jump_to_except_4(output):
     try:
         output.append(2)
-    except (ValueError, RuntimeError), e:
+    except (ValueError, RuntimeError) as e:
         output.append('except' in str(e))
 
 no_jump_to_except_4.jump = (2, 3)
@@ -492,7 +492,7 @@
         output.append(2)
         for i in 1, 2:
             output.append(4)
-    except ValueError, e:
+    except ValueError as e:
         output.append('into' in str(e))
 
 no_jump_forwards_into_block.jump = (2, 4)
@@ -503,7 +503,7 @@
         for i in 1, 2:
             output.append(3)
         output.append(4)
-    except ValueError, e:
+    except ValueError as e:
         output.append('into' in str(e))
 
 no_jump_backwards_into_block.jump = (4, 3)
@@ -516,7 +516,7 @@
             x = 1
         finally:
             output.append(6)
-    except ValueError, e:
+    except ValueError as e:
         output.append('finally' in str(e))
 
 no_jump_into_finally_block.jump = (4, 6)
@@ -529,7 +529,7 @@
         finally:
             output.append(5)
             output.append(6)
-    except ValueError, e:
+    except ValueError as e:
         output.append('finally' in str(e))
 
 no_jump_out_of_finally_block.jump = (5, 1)
@@ -539,7 +539,7 @@
 def no_jump_to_non_integers(output):
     try:
         output.append(2)
-    except ValueError, e:
+    except ValueError as e:
         output.append('integer' in str(e))
 
 no_jump_to_non_integers.jump = (2, "Spam")
@@ -551,7 +551,7 @@
     try:
         previous_frame = sys._getframe().f_back
         previous_frame.f_lineno = previous_frame.f_lineno
-    except ValueError, e:
+    except ValueError as e:
         # This is the exception we wanted; make sure the error message
         # talks about trace functions.
         if 'trace' not in str(e):
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 48c5d19..5c8a4e4 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -12,7 +12,7 @@
     def get_exception_format(self, func, exc):
         try:
             func()
-        except exc, value:
+        except exc as value:
             return traceback.format_exception_only(exc, value)
         else:
             raise ValueError, "call did not raise exception"
diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py
index 00cf202..50acff8 100644
--- a/Lib/test/test_urllib2net.py
+++ b/Lib/test/test_urllib2net.py
@@ -236,7 +236,7 @@
             debug(url)
             try:
                 f = urllib2.urlopen(url, req)
-            except (IOError, socket.error, OSError), err:
+            except (IOError, socket.error, OSError) as err:
                 debug(err)
                 if expected_err:
                     msg = ("Didn't get expected error(s) %s for %s %s, got %s" %
diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py
index 447f434..25aa307 100644
--- a/Lib/test/test_userdict.py
+++ b/Lib/test/test_userdict.py
@@ -168,7 +168,7 @@
         e = E()
         try:
             e[42]
-        except RuntimeError, err:
+        except RuntimeError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("e[42] didn't raise RuntimeError")
@@ -180,7 +180,7 @@
         f = F()
         try:
             f[42]
-        except KeyError, err:
+        except KeyError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("f[42] didn't raise KeyError")
@@ -189,7 +189,7 @@
         g = G()
         try:
             g[42]
-        except KeyError, err:
+        except KeyError as err:
             self.assertEqual(err.args, (42,))
         else:
             self.fail_("g[42] didn't raise KeyError")
diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py
index 16a55e4..7128148 100644
--- a/Lib/test/test_uu.py
+++ b/Lib/test/test_uu.py
@@ -50,7 +50,7 @@
         try:
             uu.decode(inp, out)
             self.fail("No exception thrown")
-        except uu.Error, e:
+        except uu.Error as e:
             self.assertEqual(str(e), "Truncated input file")
 
     def test_missingbegin(self):
@@ -59,7 +59,7 @@
         try:
             uu.decode(inp, out)
             self.fail("No exception thrown")
-        except uu.Error, e:
+        except uu.Error as e:
             self.assertEqual(str(e), "No valid begin line found in input file")
 
 class UUStdIOTest(unittest.TestCase):
diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py
index 5830fd6..81bd760 100644
--- a/Lib/test/test_winreg.py
+++ b/Lib/test/test_winreg.py
@@ -142,7 +142,7 @@
 if remote_name is not None:
     try:
         remote_key = ConnectRegistry(remote_name, HKEY_CURRENT_USER)
-    except EnvironmentError, exc:
+    except EnvironmentError as exc:
         print "Could not connect to the remote machine -", exc.strerror
         remote_key = None
     if remote_key is not None: