【问题标题】:How do I stop a program when an exception is raised in Python?在 Python 中引发异常时如何停止程序?
【发布时间】:2009-01-13 13:13:24
【问题描述】:

当 Python 中出现异常时,我需要停止我的程序。 我该如何实现?

【问题讨论】:

  • 你希望你的程序如何停止?
  • @Gortok:感谢您添加 [plzsendthecodez] 标签。这让我很开心!
  • 如果我们在 C++ 领域,我认为您正在寻找 GDB 中的“catch throw”等价物。然而,在 Python 中,异常带有一个回溯,告诉你它是从哪里抛出的。这还不够吗?

标签: python exception-handling


【解决方案1】:
import sys

try:
  print("stuff")
except:
  sys.exit(1) # exiing with a non zero value is better for returning from an error

【讨论】:

  • sys.exit(1) 会更合适。
  • @bruno desthuilliers 嗯,这很明显。他只要求在发生异常时退出脚本。
  • @Deestan - 为什么sys.exit(1) 更合适..?
  • @kramer65:0 的程序退出代码表示“完成且没有错误”。由于sys.exit 调用似乎是由错误引起的,它应该产生一个不是0 的程序退出代码。 1 只是一个建议。
  • @LoïcWolff:当发生未处理的异常时,脚本无需执行任何操作即可退出。这只是默认行为 - 至少它是一种更加理智的行为,因为 1/ 它会打印一个有用的错误消息,包括完整的回溯和 2/ 使用适当的(非零)退出代码返回。
【解决方案2】:

您可以停止捕获异常,或者 - 如果您需要捕获它(进行一些自定义处理),您可以重新引发:

try:
  doSomeEvilThing()
except Exception, e:
  handleException(e)
  raise

请注意,键入raise 而不传递异常对象会导致原始回溯被保留。通常它比raise e 好得多。

当然——你也可以显式调用

import sys 
sys.exit(exitCodeYouFindAppropriate)

这会引发 SystemExit 异常,并且(除非您在某处捕获它)使用指定的退出代码终止您的应用程序。

【讨论】:

  • this answer 中所述,但是如果需要进行一些处理,您可以使用sys.exc_info() 来获取足够的信息来保存re-raise
【解决方案3】:

如果您不处理异常,它会将调用堆栈向上传播到解释器,然后解释器将显示回溯并退出。 IOW :当发生异常时,您无需执行任何操作即可使脚本退出。

【讨论】:

  • 这是对非特定问题的唯一真正答案。所有其他答案似乎都对作者的意思做出了一些隐含的假设。既然我们在谈论 Python,我们应该尽可能地明确 ??
【解决方案4】:
import sys

try:
    import feedparser
except:
    print "Error: Cannot import feedparser.\n" 
    sys.exit(1)

这里我们以状态码 1 退出。输出错误消息、写入日志和清理通常也很有帮助。

【讨论】:

  • 一个未处理的异常将输出一个(更有用的)错误消息(以及完整的回溯)并以非零状态退出。您上面的代码 sn-p 是一种反模式。
  • 这真的取决于引发异常的原因。请记住,更高级别的模式是 EAFP。因此,完全有可能使用异常处理来生成用户反馈,并且用户可能只关心理智的错误消息,并且可以在没有痕迹的情况下做得更好。您可以使用logging.exception 将回溯写入日志,向用户提供有意义的反馈,然后在不重新引发异常的情况下放弃。
【解决方案5】:

据我所知,如果你的脚本没有捕捉到异常,就会被中断。

【讨论】:

    【解决方案6】:
    import sys
    
    try: 
        # your code here
    except Exception as err:
        print("Error: " + str(err))
    sys.exit(50) # whatever non zero exit code
    

    【讨论】:

    • 欢迎来到 SO!请提供一些解释以及您的代码。即使没有异常,您的代码也会退出
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多