sys.stdin = save_stdin
sys.displayhook = save_displayhook
except:
- exc_info = sys.exc_info()[:2]
- self.error(traceback.format_exception_only(*exc_info)[-1].strip())
+ self._error_exc()
def precmd(self, line):
"""Handle alias expansion and ';;' separator."""
try:
sys.call_tracing(p.run, (arg, globals, locals))
except Exception:
- exc_info = sys.exc_info()[:2]
- self.error(traceback.format_exception_only(*exc_info)[-1].strip())
+ self._error_exc()
self.message("LEAVING RECURSIVE DEBUGGER")
sys.settrace(self.trace_dispatch)
self.lastcmd = p.lastcmd
try:
return eval(arg, self.curframe.f_globals, self.curframe_locals)
except:
- exc_info = sys.exc_info()[:2]
- self.error(traceback.format_exception_only(*exc_info)[-1].strip())
+ self._error_exc()
raise
def _getval_except(self, arg, frame=None):
err = traceback.format_exception_only(*exc_info)[-1].strip()
return _rstr('** raised %s **' % err)
+ def _error_exc(self):
+ exc_info = sys.exc_info()[:2]
+ self.error(traceback.format_exception_only(*exc_info)[-1].strip())
+
+ def _msg_val_func(self, arg, func):
+ try:
+ val = self._getval(arg)
+ except:
+ return # _getval() has displayed the error
+ try:
+ self.message(func(val))
+ except:
+ self._error_exc()
+
def do_p(self, arg):
"""p expression
Print the value of the expression.
"""
- try:
- self.message(repr(self._getval(arg)))
- except:
- pass
+ self._msg_val_func(arg, repr)
def do_pp(self, arg):
"""pp expression
Pretty-print the value of the expression.
"""
- try:
- self.message(pprint.pformat(self._getval(arg)))
- except:
- pass
+ self._msg_val_func(arg, pprint.pformat)
complete_print = _complete_expression
complete_p = _complete_expression
(Pdb) continue
"""
+def test_pdb_pp_repr_exc():
+ """Test that do_p/do_pp do not swallow exceptions.
+
+ >>> class BadRepr:
+ ... def __repr__(self):
+ ... raise Exception('repr_exc')
+ >>> obj = BadRepr()
+
+ >>> def test_function():
+ ... import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+
+ >>> with PdbTestInput([ # doctest: +NORMALIZE_WHITESPACE
+ ... 'p obj',
+ ... 'pp obj',
+ ... 'continue',
+ ... ]):
+ ... test_function()
+ --Return--
+ > <doctest test.test_pdb.test_pdb_pp_repr_exc[2]>(2)test_function()->None
+ -> import pdb; pdb.Pdb(nosigint=True, readrc=False).set_trace()
+ (Pdb) p obj
+ *** Exception: repr_exc
+ (Pdb) pp obj
+ *** Exception: repr_exc
+ (Pdb) continue
+ """
+
+
def do_nothing():
pass