summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2010-07-30 22:20:16 (GMT)
committerGeorg Brandl <georg@python.org>2010-07-30 22:20:16 (GMT)
commitb90ffd88f1486896a380ee3a2e2ae0dfc8da1d49 (patch)
treeaf992a06e0ef9100a0c938f5d29fd3216ba2c1f5
parent635edd199030f2c2f7de4369638c4c9a29226219 (diff)
downloadcpython-b90ffd88f1486896a380ee3a2e2ae0dfc8da1d49.zip
cpython-b90ffd88f1486896a380ee3a2e2ae0dfc8da1d49.tar.gz
cpython-b90ffd88f1486896a380ee3a2e2ae0dfc8da1d49.tar.bz2
Part of #7245: when KeyboardInterrupt is raised while defining commands, restore the old commands instead of producing a traceback.
-rwxr-xr-xLib/pdb.py21
-rw-r--r--Misc/NEWS3
2 files changed, 23 insertions, 1 deletions
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 83e1197..3362ea1 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -371,7 +371,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
else:
return self.handle_command_def(line)
- def handle_command_def(self,line):
+ def handle_command_def(self, line):
"""Handles one command line during command list definition."""
cmd, arg, line = self.parseline(line)
if not cmd:
@@ -457,14 +457,33 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.error("Usage: commands [bnum]\n ...\n end")
return
self.commands_bnum = bnum
+ # Save old definitions for the case of a keyboard interrupt.
+ if bnum in self.commands:
+ old_command_defs = (self.commands[bnum],
+ self.commands_doprompt[bnum],
+ self.commands_silent[bnum])
+ else:
+ old_command_defs = None
self.commands[bnum] = []
self.commands_doprompt[bnum] = True
self.commands_silent[bnum] = False
+
prompt_back = self.prompt
self.prompt = '(com) '
self.commands_defining = True
try:
self.cmdloop()
+ except KeyboardInterrupt:
+ # Restore old definitions.
+ if old_command_defs:
+ self.commands[bnum] = old_command_defs[0]
+ self.commands_doprompt[bnum] = old_command_defs[1]
+ self.commands_silent[bnum] = old_command_defs[2]
+ else:
+ del self.commands[bnum]
+ del self.commands_doprompt[bnum]
+ del self.commands_silent[bnum]
+ self.error('command definition aborted, old commands restored')
finally:
self.commands_defining = False
self.prompt = prompt_back
diff --git a/Misc/NEWS b/Misc/NEWS
index 2bfebd0..b7a5eda 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -475,6 +475,9 @@ C-API
Library
-------
+- In pdb, when Ctrl-C is entered while defining commands for a
+ breakpoint, the old commands are restored.
+
- For traceback debugging, the pdb listing now also shows the locations
where the exception was originally (re)raised, if it differs from the
last line executed (e.g. in case of finally clauses).