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

检测python程序/函数/方法可能引发的异常,python,exception,Python,Exception,是否有方法“检测”函数/方法引发的异常?举例说明: 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_ex

是否有方法“检测”函数/方法引发的异常?举例说明:

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

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

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


根本没有办法提前知道(在足够有用的情况下),解释器将通过静态分析做什么。您必须有效地运行解释器,看看会发生什么,当然在运行之间可能会发生变化…

使用Python无法合理地做到这一点,原因如下:

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

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


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

明白了。。。谢谢关于你的第三点:我不想要这种“检测”,我想要的只是得到所有显式引发的异常,而不是解释器可以引发的异常,比如AttributeError.wow,刚刚意识到你是Ned Batchelder,覆盖模块的幕后黑手,对吗?我想做的是受到你们模块的启发,但不是那个么复杂的呵呵。。。我同意python的动态特性使得不可能做一个百分之百正确的分析器,但它只是对提出的内容有一个大致的了解,而不是逐个方法地读取提出的内容。:)很高兴您加入团队!:)“你必须运行解释器,看看会发生什么,当然在运行之间可能会发生变化……”但这太疯狂了!在某些情况下,我无法提前知道某个时候会发生什么!