2

我正在用 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,它应该只是一个语法差异。一种方式比另一种方式更标准,还是有另一种实现这一目标的标准途径?

4

3 回答 3

2

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

except Exception as details:
    logging.error('Unexpected error: {0}'.format(details))
于 2018-12-03T10:10:54.333 回答
0

裸 except 的主要问题是它可以捕获诸如 SystemExit 和 KeyboardInterrupt 之类的东西,它们不是标准的“代码”错误,通常不应该以与代码生成的异常相同的方式处理。使用 Exception 类并没有涵盖这些情况,因为它们不是从它继承的,所以它不仅仅是语法上的差异。

https://docs.python.org/2/howto/doanddont.html#except https://docs.python.org/3.1/howto/doanddont.html#except

如果您想处理这些特定情况,那么最好像对 SystemExit 所做的那样明确地这样做。

于 2018-12-03T10:16:38.743 回答
0

这对我有用:

try:
   <code>
   raise Exception("my error")
except Exception as e:
    raise e

如果发生我的错误,则会看到错误消息“我的错误”。如果发生未知异常,则显示默认异常处理程序的文本。在任何一种情况下都会引发异常并停止脚本。

于 2020-11-13T21:33:14.577 回答