[Python-checkins] Remove binding of captured exceptions when not used to reduce the chances of creating cycles (GH-17246)

Pablo Galindo webhook-mailer at python.org
Tue Nov 19 16:34:07 EST 2019


https://github.com/python/cpython/commit/293dd23477eef6e7c1b1e26b5bb2c1e0d79ac3c2
commit: 293dd23477eef6e7c1b1e26b5bb2c1e0d79ac3c2
branch: master
author: Pablo Galindo <Pablogsal at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-11-19T21:34:03Z
summary:

Remove binding of captured exceptions when not used to reduce the chances of creating cycles (GH-17246)

Capturing exceptions into names can lead to reference cycles though the __traceback__ attribute of the exceptions in some obscure cases that have been reported previously and fixed individually. As these variables are not used anyway, we can remove the binding to reduce the chances of creating reference cycles.

See for example GH-13135

files:
M Lib/asynchat.py
M Lib/asyncio/proactor_events.py
M Lib/asyncio/unix_events.py
M Lib/codeop.py
M Lib/ctypes/util.py
M Lib/enum.py
M Lib/filecmp.py
M Lib/getpass.py
M Lib/importlib/abc.py
M Lib/lib2to3/main.py
M Lib/msilib/__init__.py
M Lib/multiprocessing/managers.py
M Lib/multiprocessing/popen_fork.py
M Lib/poplib.py
M Lib/test/pythoninfo.py
M Lib/test/test_cgitb.py
M Lib/test/test_class.py
M Lib/test/test_codecs.py
M Lib/test/test_decimal.py
M Lib/test/test_ftplib.py
M Lib/test/test_sys_settrace.py
M Lib/test/test_time.py
M Lib/test/test_traceback.py
M Lib/test/test_urllib2net.py
M Lib/test/test_uuid.py
M Lib/unittest/case.py
M Lib/urllib/request.py
M Lib/xml/sax/__init__.py

diff --git a/Lib/asynchat.py b/Lib/asynchat.py
index fc1146adbb10d..f4ba361bd4a3e 100644
--- a/Lib/asynchat.py
+++ b/Lib/asynchat.py
@@ -117,7 +117,7 @@ def handle_read(self):
             data = self.recv(self.ac_in_buffer_size)
         except BlockingIOError:
             return
-        except OSError as why:
+        except OSError:
             self.handle_error()
             return
 
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index 830d8edc32f90..8338449aaa0a3 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -711,7 +711,7 @@ def close(self):
             raise exceptions.SendfileNotAvailableError("not a regular file")
         try:
             fsize = os.fstat(fileno).st_size
-        except OSError as err:
+        except OSError:
             raise exceptions.SendfileNotAvailableError("not a regular file")
         blocksize = count if count else fsize
         if not blocksize:
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index 66213728a3dcb..632546ad00817 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -330,7 +330,7 @@ def _child_watcher_callback(self, pid, returncode, transp):
     async def _sock_sendfile_native(self, sock, file, offset, count):
         try:
             os.sendfile
-        except AttributeError as exc:
+        except AttributeError:
             raise exceptions.SendfileNotAvailableError(
                 "os.sendfile() is not available")
         try:
@@ -339,7 +339,7 @@ def _child_watcher_callback(self, pid, returncode, transp):
             raise exceptions.SendfileNotAvailableError("not a regular file")
         try:
             fsize = os.fstat(fileno).st_size
-        except OSError as err:
+        except OSError:
             raise exceptions.SendfileNotAvailableError("not a regular file")
         blocksize = count if count else fsize
         if not blocksize:
diff --git a/Lib/codeop.py b/Lib/codeop.py
index e5c7adea54fbd..fc7e1e70ceafe 100644
--- a/Lib/codeop.py
+++ b/Lib/codeop.py
@@ -80,7 +80,7 @@ def _maybe_compile(compiler, source, filename, symbol):
 
     try:
         code = compiler(source, filename, symbol)
-    except SyntaxError as err:
+    except SyntaxError:
         pass
 
     try:
diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py
index 97973bce001d9..01176bf969657 100644
--- a/Lib/ctypes/util.py
+++ b/Lib/ctypes/util.py
@@ -302,7 +302,7 @@ def _findLib_ld(name):
                 res = re.search(expr, os.fsdecode(out))
                 if res:
                     result = res.group(0)
-            except Exception as e:
+            except Exception:
                 pass  # result will be None
             return result
 
diff --git a/Lib/enum.py b/Lib/enum.py
index 8a6e5d2e46d6b..06f42a978035b 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -420,7 +420,7 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s
         if module is None:
             try:
                 module = sys._getframe(2).f_globals['__name__']
-            except (AttributeError, ValueError, KeyError) as exc:
+            except (AttributeError, ValueError, KeyError):
                 pass
         if module is None:
             _make_class_unpicklable(enum_class)
diff --git a/Lib/filecmp.py b/Lib/filecmp.py
index e5ad8397e4c53..cfdca1e924f55 100644
--- a/Lib/filecmp.py
+++ b/Lib/filecmp.py
@@ -156,12 +156,12 @@ def phase2(self): # Distinguish files, directories, funnies
             ok = 1
             try:
                 a_stat = os.stat(a_path)
-            except OSError as why:
+            except OSError:
                 # print('Can\'t stat', a_path, ':', why.args[1])
                 ok = 0
             try:
                 b_stat = os.stat(b_path)
-            except OSError as why:
+            except OSError:
                 # print('Can\'t stat', b_path, ':', why.args[1])
                 ok = 0
 
diff --git a/Lib/getpass.py b/Lib/getpass.py
index 36e17e4cb6965..6911f41d1f205 100644
--- a/Lib/getpass.py
+++ b/Lib/getpass.py
@@ -52,7 +52,7 @@ def unix_getpass(prompt='Password: ', stream=None):
             stack.enter_context(input)
             if not stream:
                 stream = input
-        except OSError as e:
+        except OSError:
             # If that fails, see if stdin can be controlled.
             stack.close()
             try:
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py
index 4b2d3de6d96f1..b1b5ccce4bd35 100644
--- a/Lib/importlib/abc.py
+++ b/Lib/importlib/abc.py
@@ -10,7 +10,7 @@
     _frozen_importlib = None
 try:
     import _frozen_importlib_external
-except ImportError as exc:
+except ImportError:
     _frozen_importlib_external = _bootstrap_external
 import abc
 import warnings
diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py
index d6b708848ede1..c51626babf8ec 100644
--- a/Lib/lib2to3/main.py
+++ b/Lib/lib2to3/main.py
@@ -90,11 +90,11 @@ def write_file(self, new_text, filename, old_text, encoding):
             if os.path.lexists(backup):
                 try:
                     os.remove(backup)
-                except OSError as err:
+                except OSError:
                     self.log_message("Can't remove backup %s", backup)
             try:
                 os.rename(filename, backup)
-            except OSError as err:
+            except OSError:
                 self.log_message("Can't rename %s to %s", filename, backup)
         # Actually write the new file
         write = super(StdoutRefactoringTool, self).write_file
diff --git a/Lib/msilib/__init__.py b/Lib/msilib/__init__.py
index 0bc8dd9952462..0e85aa28967ea 100644
--- a/Lib/msilib/__init__.py
+++ b/Lib/msilib/__init__.py
@@ -116,7 +116,7 @@ def add_data(db, table, values):
                 raise TypeError("Unsupported type %s" % field.__class__.__name__)
         try:
             v.Modify(MSIMODIFY_INSERT, r)
-        except Exception as e:
+        except Exception:
             raise MSIError("Could not insert "+repr(values)+" into "+table)
 
         r.ClearData()
diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py
index 75b5150f821b1..1f9c2daa25d97 100644
--- a/Lib/multiprocessing/managers.py
+++ b/Lib/multiprocessing/managers.py
@@ -248,7 +248,7 @@ def serve_client(self, conn):
                     try:
                         obj, exposed, gettypeid = \
                             self.id_to_local_proxy_obj[ident]
-                    except KeyError as second_ke:
+                    except KeyError:
                         raise ke
 
                 if methodname not in exposed:
@@ -296,7 +296,7 @@ def serve_client(self, conn):
             try:
                 try:
                     send(msg)
-                except Exception as e:
+                except Exception:
                     send(('#UNSERIALIZABLE', format_exc()))
             except Exception as e:
                 util.info('exception in thread serving %r',
diff --git a/Lib/multiprocessing/popen_fork.py b/Lib/multiprocessing/popen_fork.py
index 11e216072d091..a65b06f1b2c75 100644
--- a/Lib/multiprocessing/popen_fork.py
+++ b/Lib/multiprocessing/popen_fork.py
@@ -25,7 +25,7 @@ def poll(self, flag=os.WNOHANG):
         if self.returncode is None:
             try:
                 pid, sts = os.waitpid(self.pid, flag)
-            except OSError as e:
+            except OSError:
                 # Child process not yet created. See #1731717
                 # e.errno == errno.ECHILD == 10
                 return None
diff --git a/Lib/poplib.py b/Lib/poplib.py
index e3bd2ab1ebc8b..0b6750d230376 100644
--- a/Lib/poplib.py
+++ b/Lib/poplib.py
@@ -385,7 +385,7 @@ def _parsecap(line):
             for capline in rawcaps:
                 capnm, capargs = _parsecap(capline)
                 caps[capnm] = capargs
-        except error_proto as _err:
+        except error_proto:
             raise error_proto('-ERR CAPA not supported by server')
         return caps
 
diff --git a/Lib/test/pythoninfo.py b/Lib/test/pythoninfo.py
index 797b3af7d3085..eab82c3631fd2 100644
--- a/Lib/test/pythoninfo.py
+++ b/Lib/test/pythoninfo.py
@@ -754,7 +754,7 @@ def collect_info(info):
     ):
         try:
             collect_func(info_add)
-        except Exception as exc:
+        except Exception:
             error = True
             print("ERROR: %s() failed" % (collect_func.__name__),
                   file=sys.stderr)
diff --git a/Lib/test/test_cgitb.py b/Lib/test/test_cgitb.py
index e299ec3ec6ceb..8991bc1ff34ba 100644
--- a/Lib/test/test_cgitb.py
+++ b/Lib/test/test_cgitb.py
@@ -31,7 +31,7 @@ def test_html(self):
     def test_text(self):
         try:
             raise ValueError("Hello World")
-        except ValueError as err:
+        except ValueError:
             text = cgitb.text(sys.exc_info())
             self.assertIn("ValueError", text)
             self.assertIn("Hello World", text)
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index 456f1be30be04..7524f58a3ce73 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -529,7 +529,7 @@ class I:
             # In debug mode, printed XXX undetected error and
             #  raises AttributeError
             I()
-        except AttributeError as x:
+        except AttributeError:
             pass
         else:
             self.fail("attribute error for I.__init__ got masked")
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
index e1638c111681c..3aec34c7f167d 100644
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -11,7 +11,7 @@
 
 try:
     import _testcapi
-except ImportError as exc:
+except ImportError:
     _testcapi = None
 
 try:
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 1f37b5372a3e7..fe0cfc7b66d7e 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -5600,13 +5600,13 @@ def doit(ty):
                     args, kwds = mkargs(C, c_sig)
                     try:
                         getattr(c_type(9), attr)(*args, **kwds)
-                    except Exception as err:
+                    except Exception:
                         raise TestFailed("invalid signature for %s: %s %s" % (c_func, args, kwds))
 
                     args, kwds = mkargs(P, p_sig)
                     try:
                         getattr(p_type(9), attr)(*args, **kwds)
-                    except Exception as err:
+                    except Exception:
                         raise TestFailed("invalid signature for %s: %s %s" % (p_func, args, kwds))
 
         doit('Decimal')
diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
index b0e46411a2e2b..b8eef82b15fb3 100644
--- a/Lib/test/test_ftplib.py
+++ b/Lib/test/test_ftplib.py
@@ -346,7 +346,7 @@ def _do_ssl_shutdown(self):
                 if err.args[0] in (ssl.SSL_ERROR_WANT_READ,
                                    ssl.SSL_ERROR_WANT_WRITE):
                     return
-            except OSError as err:
+            except OSError:
                 # Any "socket error" corresponds to a SSL_ERROR_SYSCALL return
                 # from OpenSSL's SSL_shutdown(), corresponding to a
                 # closed socket condition. See also:
diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py
index fdd789475d04d..d4e1ac2c83eff 100644
--- a/Lib/test/test_sys_settrace.py
+++ b/Lib/test/test_sys_settrace.py
@@ -161,8 +161,8 @@ def raises():
 def test_raise():
     try:
         raises()
-    except Exception as exc:
-        x = 1
+    except Exception:
+        pass
 
 test_raise.events = [(0, 'call'),
                      (1, 'line'),
@@ -191,7 +191,7 @@ def _settrace_and_raise(tracefunc):
 def settrace_and_raise(tracefunc):
     try:
         _settrace_and_raise(tracefunc)
-    except RuntimeError as exc:
+    except RuntimeError:
         pass
 
 settrace_and_raise.events = [(2, 'exception'),
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index 8d8d31e7825e6..80e43fafad813 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -825,7 +825,7 @@ def convert_values(ns_timestamps):
                     try:
                         result = pytime_converter(value, time_rnd)
                         expected = expected_func(value)
-                    except Exception as exc:
+                    except Exception:
                         self.fail("Error on timestamp conversion: %s" % debug_info)
                     self.assertEqual(result,
                                      expected,
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 72dc7afb8c5cc..7135d997d54ab 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -313,7 +313,7 @@ def f():
         with captured_output("stderr") as stderr_f:
             try:
                 f()
-            except RecursionError as exc:
+            except RecursionError:
                 render_exc()
             else:
                 self.fail("no recursion occurred")
@@ -360,7 +360,7 @@ def g(count=10):
         with captured_output("stderr") as stderr_g:
             try:
                 g()
-            except ValueError as exc:
+            except ValueError:
                 render_exc()
             else:
                 self.fail("no value error was raised")
@@ -396,7 +396,7 @@ def h(count=10):
         with captured_output("stderr") as stderr_h:
             try:
                 h()
-            except ValueError as exc:
+            except ValueError:
                 render_exc()
             else:
                 self.fail("no value error was raised")
@@ -424,7 +424,7 @@ def h(count=10):
         with captured_output("stderr") as stderr_g:
             try:
                 g(traceback._RECURSIVE_CUTOFF)
-            except ValueError as exc:
+            except ValueError:
                 render_exc()
             else:
                 self.fail("no error raised")
@@ -452,7 +452,7 @@ def h(count=10):
         with captured_output("stderr") as stderr_g:
             try:
                 g(traceback._RECURSIVE_CUTOFF + 1)
-            except ValueError as exc:
+            except ValueError:
                 render_exc()
             else:
                 self.fail("no error raised")
diff --git a/Lib/test/test_urllib2net.py b/Lib/test/test_urllib2net.py
index 040a2ce276dbd..bb0500e12a49a 100644
--- a/Lib/test/test_urllib2net.py
+++ b/Lib/test/test_urllib2net.py
@@ -199,7 +199,7 @@ def test_sites_no_connection_close(self):
             try:
                 with urllib.request.urlopen(URL) as res:
                     pass
-            except ValueError as e:
+            except ValueError:
                 self.fail("urlopen failed for site not sending \
                            Connection:close")
             else:
diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py
index ddf7e6dc1b8e4..b76c60e1ce28b 100644
--- a/Lib/test/test_uuid.py
+++ b/Lib/test/test_uuid.py
@@ -471,7 +471,7 @@ def test_uuid1_eui64(self):
         # the value from too_large_getter above.
         try:
             self.uuid.uuid1(node=node)
-        except ValueError as e:
+        except ValueError:
             self.fail('uuid1 was given an invalid node ID')
 
     def test_uuid1(self):
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
index bac9789c943fa..fa64a6ea2378c 100644
--- a/Lib/unittest/case.py
+++ b/Lib/unittest/case.py
@@ -712,7 +712,7 @@ def doClassCleanups(cls):
             function, args, kwargs = cls._class_cleanups.pop()
             try:
                 function(*args, **kwargs)
-            except Exception as exc:
+            except Exception:
                 cls.tearDown_exceptions.append(sys.exc_info())
 
     def __call__(self, *args, **kwds):
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 721c152179e99..ebc41184f83d5 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -1778,7 +1778,7 @@ def retrieve(self, url, filename=None, reporthook=None, data=None):
                 hdrs = fp.info()
                 fp.close()
                 return url2pathname(_splithost(url1)[1]), hdrs
-            except OSError as msg:
+            except OSError:
                 pass
         fp = self.open(url, data)
         try:
diff --git a/Lib/xml/sax/__init__.py b/Lib/xml/sax/__init__.py
index a0f5d40b2000c..17b75879ebaaf 100644
--- a/Lib/xml/sax/__init__.py
+++ b/Lib/xml/sax/__init__.py
@@ -78,7 +78,7 @@ def make_parser(parser_list=()):
     for parser_name in list(parser_list) + default_parser_list:
         try:
             return _create_parser(parser_name)
-        except ImportError as e:
+        except ImportError:
             import sys
             if parser_name in sys.modules:
                 # The parser module was found, but importing it



More information about the Python-checkins mailing list