首页 > 解决方案 > Python 异常 - 捕获除预期之外的所有异常

问题描述

我正在用 Python 编写一个简单的自动化脚本,它可能会在不同的地方抛出异常。在他们每个人中,我都想记录一条特定的消息并退出程序。为了做到这一点,我在捕获异常并处理它(执行特定的日志记录操作等)之后引发 SystemExit。

在 main 的顶级调用中,我执行以下操作:

if __name__ == "__main__":
    try:
        main()
    except SystemExit:  # handled exception
        sys.exit(1)
    except:  # any unhandled exception
        logging.error('Unexpected error: ', exc_info=True)
        sys.exit(2)

但是,使用裸的 except 是不受欢迎的。是否正在使用“异常树”,其中我使用裸露的除了指定“除了我处理的异常之外的任何内容”是一种非标准方式?有没有更好的方法来实现这一目标?我仍然想记录这些未处理的异常,即使它们没有被处理。

编辑: SystemExit 提示已处理异常 - 无论在我的情况下是什么异常,我总是想停止运行脚本,因为任何失败都应该导致绝对失败。

我问这个的主要原因是 PEP8 似乎考虑使用一个裸除了作为错误,即使我可以使用除了 BaseException,它应该只是一个语法差异。一种方式比另一种方式更标准,还是有另一种实现这一目标的标准途径?

标签: pythonexceptionthrowraisesystemexit

解决方案


裸异常会捕获您不想捕获的内容,例如GeneratorExit. 这样做:

except Exception as details:
    logging.error('Unexpected error: {0}'.format(details))

推荐阅读