首页 > 解决方案 > 在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()

谢谢

标签: pythonpython-3.x

解决方案


好吧,您的两个片段之间的主要(没有双关语 xD)区别在于,在第二个版本中,try/except 块只会在您将脚本作为脚本运行时设置 - 而不是在您将其作为模块导入并调用main()功能。这是否是您想要的取决于您的具体用例,因此只有您可以在这里判断哪个更合适。

现在在这两种情况下都存在一个问题:您使用的是一个空的 except 子句(它实际上可能比您预期的要捕获更多),并且完全忽略了异常本身,因此您丢失了所有关于出错的地方和位置的有用调试信息,所以你想要的实际上是:

try:
   some_code_that_may_raise()
except Exception as e:
   log_the_error(e)

请注意 FWIW,Python 有一个非常全面的(即使不是特别容易学习)logging包,它知道如何格式化异常回溯等。这在实践中非常有用,所以花几天时间来学习如何正确使用它真的很值得。


推荐阅读