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