检测一个Python程序/函数/方法可能会引发哪些异常

3

有没有一种方法可以“检测”函数/方法引发的异常?举个例子:

def foo():
    print 'inside foo, next calling bar()'
    _bar()
    _baz()
    # lots of other methods calls which raise other legitimate exceptions

def _bar():
    raise my_exceptions.NotFound

def _baz():
    raise my_exceptions.BadRequest

假设Foo是我的API的一部分,我需要对其进行文档化,有没有一种方法可以获取它可能引发的所有异常?

只是为了明确,我不想处理这些异常,它们应该会发生(例如,当找不到资源或请求格式错误时)。

我考虑创建一些工具,将该代码序列转换为类似于“行内”的东西:

def foo():
    print 'inside foo, next calling bar()'
    # what _bar() does
    raise my_exceptions.NotFound
    # what _baz() does
    raise my_exceptions.BadRequest
    # lots of other methods calls which raise other legitimate exceptions

有没有什么能帮助我检测这个问题的东西,而不是逐个方法调用进行导航?(这需要深入几个文件。)

2个回答

4

有几个原因,你无法合理地使用Python完成此操作:

1)Python原语没有精确记录它们可能抛出的异常。Python的精神是任何时候都可以抛出任何异常。

2)Python的动态性使得静态分析代码非常困难,几乎不可能知道代码可能会做什么。

3)各种无趣的异常都必须列在列表中,例如,如果你有self.foo,那么它可能会引发AttributeError。需要一个非常复杂的分析器才能找出foo必须存在。


明白了...谢谢! 关于你的第三点:我不想要这种“检测”,我只想获取所有显式引发的异常,而不是解释器可以引发的异常,比如AttributeError。 - maurorodrigues
哇,我才意识到你是Ned Batchelder,覆盖率模块背后的那个人,是吗? 我的想法基本上是受你的模块启发的,但不是那么复杂呵呵... 我同意Python动态性质使得不可能有一个分析器是100%正确的,但只要能够对引发的内容有一个大致的了解,而不是逐个方法地阅读引发的内容,就足够了。 - maurorodrigues
很高兴你加入我们的团队! - Ned Batchelder

3
不行,因为Python的动态特性。如果一个函数在运行时选择另一个函数(非常常见),或者代码稍后被monkeypatched,那么你的工具怎么工作呢?
静态分析无法提前知道解释器会执行什么(用足够的场景是有用的)。你必须有效地运行解释器并查看发生了什么,这当然可能在不同的运行之间发生变化...

你必须有效地运行解释器并观察发生了什么,当然这可能会在不同的运行之间发生变化...但这太疯狂了!我无法预先知道在某些情况下可能会发生什么事情! - Protector one

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接