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

有什么可以帮助我检测而不是浏览每个方法调用吗?(深入到几个文件中。)

4

2 回答 2

4

由于以下几个原因,您无法使用 Python 合理地执行此操作:

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

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

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

于 2012-12-26T21:05:18.697 回答
3

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

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

于 2012-12-26T21:03:16.417 回答