Python 异常 - 捕获除预期之外的所有异常

Python exceptions - catching all exceptions but the one expected

我正在 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 是不受欢迎的。在我使用 bare except 指定 "anything but the exception that I've handled" 的地方使用 "exception tree" 是一种非标准方式吗?有没有更好的方法来实现这一目标?我仍然想记录这些未处理的异常,即使它们没有被处理。

编辑:引发 SystemExit 以注意已处理异常 - 无论我的情况是什么异常,我总是想停止 运行 脚本,因为任何失败都应该导致绝对失败.

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

裸异常会捕获你不想捕获的东西,比如GeneratorExit。这样做:

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

bare except 的主要问题是它可以捕获诸如 SystemExit 和 KeyboardInterrupt 之类的非标准 'code' 错误,并且通常不应以与代码生成的异常相同的方式处理.使用 Exception class 不涵盖这些情况,因为它们不是从它继承的,所以它不仅仅是语法差异。

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

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

这对我有用:

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

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