[Python-checkins] cpython: Issue #20167: Suppress 3.4 specific 'Exception ignored' messages.

terry.reedy python-checkins at python.org
Sat Feb 8 10:48:00 CET 2014


http://hg.python.org/cpython/rev/f9f2c57f7d00
changeset:   89030:f9f2c57f7d00
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Sat Feb 08 04:47:29 2014 -0500
summary:
  Issue #20167: Suppress 3.4 specific 'Exception ignored' messages.
Original patch by Tal Einat.

files:
  Lib/idlelib/MultiCall.py |  27 +++++++++++++++++++++++----
  1 files changed, 23 insertions(+), 4 deletions(-)


diff --git a/Lib/idlelib/MultiCall.py b/Lib/idlelib/MultiCall.py
--- a/Lib/idlelib/MultiCall.py
+++ b/Lib/idlelib/MultiCall.py
@@ -57,6 +57,13 @@
                          for number in range(len(_modifiers))
                          for name in _modifiers[number]])
 
+# In 3.4, if no shell window is ever open, the underlying Tk widget is
+# destroyed before .__del__ methods here are called.  The following
+# is used to selectively ignore shutdown exceptions to avoid
+# 'Exception ignored' messages.  See http://bugs.python.org/issue20167
+APPLICATION_GONE = '''\
+can't invoke "bind" command:  application has been destroyed'''
+
 # A binder is a class which binds functions to one type of event. It has two
 # methods: bind and unbind, which get a function and a parsed sequence, as
 # returned by _parse_sequence(). There are two types of binders:
@@ -98,7 +105,12 @@
 
     def __del__(self):
         if self.handlerid:
-            self.widget.unbind(self.widgetinst, self.sequence, self.handlerid)
+            try:
+                self.widget.unbind(self.widgetinst, self.sequence,
+                        self.handlerid)
+            except tkinter.TclError as e:
+                if e.args[0] == APPLICATION_GONE:
+                    pass
 
 # An int in range(1 << len(_modifiers)) represents a combination of modifiers
 # (if the least significent bit is on, _modifiers[0] is on, and so on).
@@ -227,7 +239,11 @@
 
     def __del__(self):
         for seq, id in self.handlerids:
-            self.widget.unbind(self.widgetinst, seq, id)
+            try:
+                self.widget.unbind(self.widgetinst, seq, id)
+            except tkinter.TclError as e:
+                if e.args[0] == APPLICATION_GONE:
+                    break
 
 # define the list of event types to be handled by MultiEvent. the order is
 # compatible with the definition of event type constants.
@@ -390,8 +406,11 @@
                 func, triplets = self.__eventinfo[virtual]
                 if func:
                     for triplet in triplets:
-                        self.__binders[triplet[1]].unbind(triplet, func)
-
+                        try:
+                            self.__binders[triplet[1]].unbind(triplet, func)
+                        except tkinter.TclError as e:
+                            if e.args[0] == APPLICATION_GONE:
+                                break
 
     _multicall_dict[widget] = MultiCall
     return MultiCall

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list