当Python中出现异常时,我该如何停止程序?

94

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


你希望程序如何停止? - PEZ
1
@Gortok:感谢您添加了[plzsendthecodez]标签。这让我的一天都变得美好了! - S.Lott
1
如果我们处于C++领域,我会认为你正在寻找GDB中“catch throw”的等效物。然而,在Python中,异常携带了一个回溯,告诉你它从哪里抛出。这不够吗? - user3458
5个回答

90
import sys

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

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

68

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

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

注意,如果没有传递异常对象就使用 raise ,则原始的回溯信息将被保留。通常情况下,这比使用 raise e 要好得多。

当然,你也可以显式地调用

import sys 
sys.exit(exitCodeYouFindAppropriate)
这会导致SystemExit异常被引发,除非你在某个地方捕获它,否则会以指定的退出代码终止你的应用程序。

1
此答案中所述,您可以使用sys.exc_info()来获取足够的信息以进行保留的重新raise,如果需要进行一些处理。 - Tobias Kienzler

27

如果你不处理异常,它会向上传递到解释器的调用堆栈中,然后显示一个回溯信息并退出。换句话说:当异常发生时,你就无需做任何事情即可使脚本退出。


9
这是一个不太具体的问题的唯一真正答案。所有其他答案似乎都对作者的意图进行了一些隐含的假设。既然我们在谈论Python,我们应该尽可能地明确。 - tbrlpld

11
import sys

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

这里我们使用状态码 1 来退出。通常还有帮助输出错误消息、写入日志和清理的操作。


10
如果出现未处理的异常,会输出更有用的错误消息(以及完整的回溯信息),并以非零状态退出。你上面的代码片段是一种反面模式。 - bruno desthuilliers
这真的取决于引发异常的原因。请记住,更高级别的模式是EAFP。因此,完全有可能使用异常处理来生成用户反馈,并且用户可能只关心合理的错误消息,而不需要跟踪信息。您可以使用logging.exception将回溯写入日志,向用户提供有意义的反馈,然后退出而不重新引发异常。 - cowbert

5
据我所知,如果您的脚本未捕获异常,它将被中断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接