From b90ffd88f1486896a380ee3a2e2ae0dfc8da1d49 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 30 Jul 2010 22:20:16 +0000 Subject: [PATCH] Part of #7245: when KeyboardInterrupt is raised while defining commands, restore the old commands instead of producing a traceback. --- Lib/pdb.py | 21 ++++++++++++++++++++- Misc/NEWS | 3 +++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index 83e1197b7c9..3362ea1e704 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 2bfebd01ece..b7a5eda0cbb 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).