【问题标题】:Python - try-exceptPython - 尝试除外
【发布时间】:2019-09-16 19:35:18
【问题描述】:

我正在尝试理解 Python 的 try-except 构造。它似乎很复杂,因为它有可选的finallyelse 子句。此外,其中可能涉及returnbreakcontinue。您可以决定命名或不命名您捕获的异常等...

无论如何,我想我现在很好地理解了控制流程,但这里引用了 Python 文档中的一段话,我觉得这是错误的。

以下几点讨论发生异常时更复杂的情况:

如果在 try 子句执行过程中发生异常,该异常可以由 except 子句处理。在所有情况下,都会在 finally 子句执行后重新引发异常。

引用来自https://docs.python.org/3/tutorial/errors.html

第 8.6 点

最后一句话似乎不对。他们是什么意思?似乎完全错误。我的测试表明,如果您捕获并处理它(当然),则不会重新引发异常。那么......来自文档的注释是什么意思?

谁能解释一下?

编辑: 在我提出这个问题后,似乎有人修复了文档页面。是这样吗?

【问题讨论】:

  • 参见“一个更复杂的例子:”下面几行,它演示了这个案例。
  • @Barmar 但是这个例子并不是“在所有情况下”,它只是在你没有捕捉到正确的异常类型的情况下。
  • 是的,我没有仔细阅读示例。
  • 我怀疑它应该读作“在所有其他情况下”。
  • @chepner 伟大的思想都一样,我只是写了与答案评论相同的东西。

标签: python python-3.x


【解决方案1】:

我只是查了一下,因为这对我来说也很奇怪。我认为那里的措辞非常糟糕。您是完全正确的,如果在 except 块内处理异常,则不会重新引发异常。

他们指的是这种异常没有被捕获的情况:

如您所见,finally 子句在任何情况下都会执行。这 通过划分两个字符串引发的 TypeError 不由 except 处理 子句,因此在 finally 子句被重新提出后 执行。

这是来自the same example you posted,就在下面几行。

所以,总结一下。文档可能应该说:

如果在 try 子句执行过程中发生异常,则 异常可以由 except 子句处理。在所有情况下,一个 在 finally 子句执行后重新引发异常,如果它没有被异常块之一捕获

正如讨论中指出的那样,这似乎是预期的措辞:

如果在 try 子句执行过程中发生异常,则 异常可以由 except 子句处理。在所有其他情况下,一个 在 finally 子句执行后重新引发异常。

【讨论】:

  • 这个答案需要一些工作。您无法在 finally 子句中捕获或处理异常。
  • 他们可能打算写“在所有其他情况下”
  • @Barmar 哦,也许……如果写了“所有其他情况”,那就有意义了。
  • 这样:“如果try 语句到达breakcontinuereturn 语句,则finally 子句将在break、@ 之前执行987654330@ 或 return 语句的执行。” >>> 好的,return 我明白了,但是... 但是 breakcontinue 与 try-except 构造有什么关系?我猜他们的意思是在 try-except 嵌入循环的情况下,对吧?
  • 是的,但是 continue/break 暗示因为它们是具有指定含义和上下文的保留字,所以我认为措辞还可以
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
相关资源
最近更新 更多