检测python程序/函数/方法可以引发的异常

时间:2012-12-26 20:55:34

标签: python exception exception-handling

大家好,有没有办法去发现'什么例外函数/方法引发?示例性:

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 个答案:

答案 0 :(得分:4)

由于以下几个原因,你无法合理地使用Python:

1)Python原语并未准确记录它们可以抛出的异常。 Python的精神是任何事都可以随时抛出任何异常。

2)Python的动态特性使得完全静态分析代码变得非常困难,几乎不可能知道“可能”代码是什么。

3)所有类型的无趣异常都必须在列表中,例如,如果你有self.foo,那么可以引发AttributeError。需要一个非常复杂的分析器来确定foo必须存在。

答案 1 :(得分:3)

不,因为Python的动态特性。如果函数在运行时选择了另一个函数(很常见),或者代码后来被monkeypatched,你的工具将如何工作?

没有办法提前知道(在足够的情况下它有用),解释器将通过静态分析做什么。你实际上必须运行解释器,看看会发生什么,当然可以在运行之间改变......