python - 在python中捕获整个脚本的异常
问题描述
这些方法中的任何一个都合适吗?我正在尝试获取一般的“此脚本失败”类型的异常以向日志表发送消息。该脚本是从由 ansible play 启动的命令行运行的(带有 async:0 poll:0 的 shell 模块)。在 main() 和各种函数中,我将状态消息发送到日志表,但我需要知道脚本是否完全失败。
main()
try:
logic()
if more code:
more_logic()
except:
send_error()
或者像这样更好:
if __name__ == "__main__":
try:
main()
except:
send_error()
谢谢
解决方案
好吧,您的两个片段之间的主要(没有双关语 xD)区别在于,在第二个版本中,try/except 块只会在您将脚本作为脚本运行时设置 - 而不是在您将其作为模块导入并调用main()
功能。这是否是您想要的取决于您的具体用例,因此只有您可以在这里判断哪个更合适。
现在在这两种情况下都存在一个问题:您使用的是一个空的 except 子句(它实际上可能比您预期的要捕获更多),并且完全忽略了异常本身,因此您丢失了所有关于出错的地方和位置的有用调试信息,所以你想要的实际上是:
try:
some_code_that_may_raise()
except Exception as e:
log_the_error(e)
请注意 FWIW,Python 有一个非常全面的(即使不是特别容易学习)logging
包,它知道如何格式化异常回溯等。这在实践中非常有用,所以花几天时间来学习如何正确使用它真的很值得。
推荐阅读
- svn - 寻求有关计划升级 TRAC-SubVersion Server 的建议
- php - 对象管理器在模板文件 Magento 2.3.3 中返回错误数据
- node.js - Apache-Pulsar 吞吐量
- c# - 在 XML 反序列化 C# 时设置默认值
- node.js - 无法将任何 ENV 变量从 docker 传递到 Node process.env
- java - 如何测量 Java 代码库中的测试密度?
- jquery - 如何选择 val?[私人]
- spring - Sprint 启动:POST 带有外键的实体
- java - 如何从 sql3 数据库中获取时间并转换为 LocalTime
- or-tools - 车辆路径问题,如何调用数据