繁体   English   中英

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 来指定“除了我处理过的异常之外的任何内容”,这是一种非标准方式? 有没有更好的方法来实现这一目标? 我仍然想记录这些未处理的异常,即使它们没有被处理。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM