[英]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.