Python:静态检测未处理的异常

问题描述 投票:0回答:4

我正在尝试用 Python 编写一段高度可靠的代码。我遇到的最常见的问题是,在运行一段时间后,会出现一些边缘情况并引发一个我没有处理过的异常。这最常发生在使用外部库时——在不阅读源代码的情况下,我不知道有一种简单的方法来获取使用特定库函数时可能引发的所有异常的列表,因此很难知道要处理什么.我知道使用包罗万象的处理程序是不好的做法,所以我一直没有这样做。

有好的解决办法吗?静态分析工具似乎应该可以检查是否处理了所有异常,但我还没有找到。这存在吗?如果不是,为什么? (这是不可能的吗?一个坏主意?等等)出于上述原因,我特别希望它能够分析导入的代码。

python exception static-analysis
4个回答
3
投票

“使用包罗万象的处理程序是不好的做法”忽略异常

我们的网络服务有一个 except 包裹了主循环。

except: 
    log_exception()
    attempt_recovery() 

这很好,因为它通知我们(必要)意外错误,然后尝试恢复(不必要)。然后我们可以查看这些日志并找出问题所在,这样我们就可以防止它再次遇到我们的一般异常。


这是你想要避免的

except:
    pass

因为它忽略错误...那么你不知道发生了错误,你的数据可能被熊破坏/无效/消失/偷走了。您的服务器可能启动/关闭/着火了。我们不知道,因为我们忽略了异常。


Python 不需要注册可能抛出的异常,因此不会检查模块可能抛出的所有异常,但大多数都会让您了解应该准备好在文档中处理的内容。根据您的服务,当它遇到未处理的异常时,您可能想要:

  • 记录并崩溃
  • 记录并尝试继续
  • 登录并重启

注意到趋势了吗?行动改变了,但你永远不想忽视它。


2
投票

好问题。

您可以尝试静态地解决问题(例如,通过引入自定义

flake8
规则?),但是,我认为,这是测试和测试覆盖范围的问题。我会通过在使用第三方包的地方添加更多“负路径”/“错误处理”检查/测试来解决这个问题,在需要时引入模拟副作用并同时监控覆盖率报告。

我还会研究 Mutation Testing 想法(查看 Cosmic Ray Python 包)。我不确定是否可以将突变体配置为也抛出异常,但看看它是否有帮助。


0
投票

与其尝试处理所有异常,这正如您所描述的那样非常困难,为什么不捕获所有异常,而是排除一些异常,例如您在评论中提到的

KeyboardInterrupt

这可能有帮助


0
投票

前几天我看到你的问题并做了this.

它远非完美,但或多或少可以满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.