我可以在AssertionError上强制调试python吗?

时间:2012-08-31 14:35:24

标签: python python-3.x assert pdb

假设我有一个python程序,其中assert用于定义事物应该是什么,我想用read-eval-loop捕获异常,而不是抛出AssertionError

当然,我可以

if (reality!=expectation):
    print("assertion failed");
    import pdb; pdb.set_trace();

但是在代码中这比普通assert(reality==expectation)更难看。

我可以在顶层的pdb.set_trace()区块中调用except:,但之后我已经失去了失败的所有背景,对吧? (我的意思是,堆栈跟踪可以从异常对象中恢复,但不能从参数值中恢复等。)

有没有--magic命令行标志可以将python3解释器变成我需要的东西?

2 个答案:

答案 0 :(得分:11)

主要来自this great snippet

import sys

def info(type, value, tb):
   if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError:
      # we are in interactive mode or we don't have a tty-like
      # device, so we call the default hook
      sys.__excepthook__(type, value, tb)
   else:
      import traceback, pdb
      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(type, value, tb)
      print
      # ...then start the debugger in post-mortem mode.
      pdb.pm()

sys.excepthook = info

使用此代码初始化代码时,所有AssertionError都应调用pdb。

答案 1 :(得分:4)

查看nose项目。您可以将其与--pdb option一起使用,以便在出现错误时插入调试器。