python / cpython

The Python programming language
https://www.python.org
Other
62.31k stars 29.93k forks source link

IDLE - remove all bare excepts #59518

Open f52c13af-a5a0-4c40-a7a2-6ce855459ec8 opened 12 years ago

f52c13af-a5a0-4c40-a7a2-6ce855459ec8 commented 12 years ago
BPO 15313
Nosy @terryjreedy, @serwy

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields: ```python assignee = 'https://github.com/terryjreedy' closed_at = None created_at = labels = ['expert-IDLE', 'type-bug', '3.7'] title = 'IDLE - remove all bare excepts' updated_at = user = 'https://github.com/serwy' ``` bugs.python.org fields: ```python activity = actor = 'terry.reedy' assignee = 'terry.reedy' closed = False closed_date = None closer = None components = ['IDLE'] creation = creator = 'roger.serwy' dependencies = [] files = [] hgrepos = [] issue_num = 15313 keywords = [] message_count = 5.0 messages = ['165145', '165157', '165162', '165163', '202449'] nosy_count = 2.0 nosy_names = ['terry.reedy', 'roger.serwy'] pr_nums = [] priority = 'normal' resolution = None stage = 'needs patch' status = 'open' superseder = None type = 'behavior' url = 'https://bugs.python.org/issue15313' versions = ['Python 3.6', 'Python 3.7'] ```

f52c13af-a5a0-4c40-a7a2-6ce855459ec8 commented 12 years ago

There are a lot of bare exceptions in IDLE. Here's the output of "grep -n 'except:' *.py"

AutoComplete.py:184: except: AutoComplete.py:209: except: Debugger.py:172: except: Debugger.py:344: except: EditorWindow.py:999: except: ObjectBrowser.py:38: except: ObjectBrowser.py:100: except: PyShell.py:133: except: # but debugger may not be active right now.... PyShell.py:154: except: PyShell.py:161: except: PyShell.py:176: except: PyShell.py:433: except: PyShell.py:742: except: PyShell.py:869: except: PyShell.py:1043: except: PyShell.py:1096: except: PyShell.py:1193: except: PyShell.py:1214: except: PyShell.py:1245: except: rpc.py:106: except: rpc.py:206: except: run.py:88: except: run.py:120: except: run.py:125: except: run.py:248: except: run.py:332: except: SearchEngine.py:72: except: StackViewer.py:66: except: WindowList.py:47: except:

Slowly, these exceptions should be refined to include the exact exception being caught.

terryjreedy commented 12 years ago

And possibly change the except clause. The except clause at PyShell 1245 was 'pass', which masked the issue of bpo-13532 and was changed to 'raise' to effectively remove the try: except: to make the unknown problem more visible. It should perhaps be really removed if and when all calls to PyShell.write(s) are properly guarded to make sure 's' is writable.

f52c13af-a5a0-4c40-a7a2-6ce855459ec8 commented 12 years ago

Line 1245 is part of this code (in time, these line numbers will change.)

    try:
        self.text.mark_gravity("iomark", "right")
        OutputWindow.write(self, s, tags, "iomark")
        self.text.mark_gravity("iomark", "left")
    except:
        raise ###pass  # ### 11Aug07 KBK if we are expecting exceptions
                       \# let's find out what they are and be specific.

The delegator chain that sits between OutputWindow.write and the Tkinter text.insert method can raise any error. (The ColorDelegator would raise a TypeError when "s" was not a string). I'd rather not replace this with "except Exception:" since the delegators should catch their own errors.

I suggest removing this try/catch block.

f52c13af-a5a0-4c40-a7a2-6ce855459ec8 commented 12 years ago

Also, bpo-13582 will become relevant on Windows since modifying the bare excepts may let uncaught exceptions be written to stderr, causing IDLE to crash.

terryjreedy commented 10 years ago

RA's patch for bpo-16261 suggests

diff -r b76d2d8db81f Lib/idlelib/PyShell.py
--- a/Lib/idlelib/PyShell.py    Mon Dec 17 13:43:14 2012 +0530
+++ b/Lib/idlelib/PyShell.py    Wed Jan 09 19:10:26 2013 +0530
@@ -152,7 +152,7 @@
         lineno = int(float(text.index("insert")))
         try:
             self.breakpoints.remove(lineno)
-        except:
+        except ValueError:
             pass
         text.tag_remove("BREAK", "insert linestart",\
                         "insert lineend +1char")