Python 查找函数可以引发的所有异常

Python 查找函数可以引发的所有异常,python,Python,我们正在进行一个中型商业Python项目,在使用标准库中的函数时有一个问题 标准库的文档通常不会列出一个函数可以抛出的所有(甚至任何)异常,因此我们尝试所有我们能想到的错误案例,查看库的源代码,然后捕获任何可能的异常。但是我们经常会错过一个仍然可能发生的随机错误,但是我们没有想到。例如,我们没有注意到,如果任何内置常量拼写错误(例如,True而不是True),json.loads()可能会引发ValueError 在其他情况下,我们尝试只捕获异常,因为代码的这一部分非常关键,它不应该在异常时中断

我们正在进行一个中型商业Python项目,在使用标准库中的函数时有一个问题

标准库的文档通常不会列出一个函数可以抛出的所有(甚至任何)异常,因此我们尝试所有我们能想到的错误案例,查看库的源代码,然后捕获任何可能的异常。但是我们经常会错过一个仍然可能发生的随机错误,但是我们没有想到。例如,我们没有注意到,如果任何内置常量拼写错误(例如,True而不是True),json.loads()可能会引发ValueError

在其他情况下,我们尝试只捕获异常,因为代码的这一部分非常关键,它不应该在异常时中断,而应该再试一次。这里的问题是,它甚至捕捉到了键盘中断

那么,是否有任何方法可以找到函数可能引发的所有异常,即使文档中没有对此做任何说明?
是否有任何工具可以确定可以引发哪些异常?

除了读取该函数中可以采用的所有可能的代码路径并查看可以引发哪些异常之外,没有其他真正的方法。我想可以编写某种自动化工具来实现这一点,但即使这样也很棘手,因为由于python的动态特性,几乎任何异常都可以从任何地方引发(如果我真的想,我总是可以用另一个函数来修补依赖函数,从而完全引发其他问题)

撇开Monkey Patching不谈,要想真正做到这一点,你需要一个非常好的类型推断器(也许
astroid
会有帮助?)来推断各种
TypeError
AttributeError
,这些可能是由于访问不存在的成员或使用错误参数调用函数而引起的,等等。
ValueError
特别棘手,因为当您传递正确类型的内容时,它仍然会被引发

在其他情况下,我们尝试只捕获异常,因为代码的这一部分非常关键,它不应该在异常时中断,而应该再试一次。这里的问题是,它甚至捕捉到了键盘中断

这对我来说是个坏主意。首先,重试代码只应针对在重试时可能会产生不同结果的异常(奇怪的连接问题等)。对于
ValueError
案例,您只需再次提高
ValueError
。这里最好的情况是,允许
ValueError
在第二次调用时从异常处理程序中传播出去——最坏的情况是,您最终进入了一个无限循环(或
recursioneerror
),您实际上没有获得多少信息来帮助调试


捕获
异常
应该是最后一种手段(而且它不应该捕获
键盘中断
系统退出
,因为它们不是从
异常继承的)并且可能只需要格式化某种错误消息,以便有人可以使用它来跟踪问题并解决问题。

如果您不想捕获键盘中断,您可以捕获
StandardError
,但没有任何工具可以静态地告诉您函数在运行时可能会引发哪些错误。FWIW,
KeyboardInterrupt
不会从
Exception
继承,因此
Exception
不应捕捉
键盘中断
…感谢您的回答!我指的代码部分是用来通过RESTAPI发送心跳信号,以表明状态仍然正确。丢失其中一些信号是完全可以的,因为只有在丢失10个信号后,对方站点才会做出反应。但是如果处理程序完全崩溃,因为我们忘记捕获一些模糊的异常(在本例中是超时异常),那将非常糟糕。一般来说,我真的不喜欢捕获异常,但我不能让生产中的代码因为忘记捕获异常而随机失败。同时,这使得调试真正的错误非常困难。我希望Python检查过Java之类的异常。。。那会让事情变得容易得多。