6
try:
    #statement 1
    #statement 2
except Exception, err:
    print err
    pass

这可能非常微不足道,但直到现在我才真正考虑过它,我发现自己无法回答以下问题:

  1. 如果语句 1 中出现错误,语句 2 会被执行吗?

  2. 在语句 1 和语句 2 都出现错误的情况下,Exception 如何处理?它在上面的代码中打印出哪个错误?两个都?

4

5 回答 5

13

您的两个问题的答案都是“否”。

一旦在try/except块中抛出错误,该try部分就会立即退出:

>>> try:
...     1/0
...     print 'hi'
... except ZeroDivisionError, e:
...     print 'error'
...
error
>>>

如您所见,print 'hi'即使我except为它做了一个代码,代码也永远不会到达该部分。

你可以在这里阅读更多。

于 2013-10-25T14:55:13.523 回答
9

来自 Python 文档:

如果在 try 子句执行期间发生异常,则跳过该子句的其余部分。然后如果它的类型与以 except 关键字命名的异常匹配,则执行 except 子句,然后在 try 语句之后继续执行。

所以一旦发生错误,它就会跳到异常

http://docs.python.org/2/tutorial/errors.html

于 2013-10-25T14:55:21.380 回答
4

在引发异常时,控制会在引发异常try的点离开块并将其提供给适当的except块。如果语句 1 抛出异常,语句 2 将不会执行。

这也回答了您的第二个问题:您描述的场景不可能发生。

于 2013-10-25T14:54:33.770 回答
4

1) 如果语句 1 中出现错误,语句 2 会被执行吗?

不会。异常将被引发和捕获。据我了解,python 将向上移动堆栈并在调用者中查找异常处理程序

2) 语句 1 和语句 2 都出现错误时,Exception 如何处理?它在上面的代码中打印出哪个错误?两个都?

语句 2 将不会运行,因此不会引发异常

该块的任何异常try都将被捕获。这就是为什么对于所有try/except子句,将 try 子句限制为必要的绝对最小代码量。同样,这避免了掩盖错误。

于 2013-10-25T14:54:45.580 回答
3

1) 如果语句 1 中出现错误,语句 2 会被执行吗?

不,不执行语句 2

2) 语句 1 和语句 2 都出现错误时,Exception 如何处理?它在上面的代码中打印出哪个错误?两个都?

只有语句 1 有机会引发错误,见上文,

注意:如果您希望语句 2 始终执行,您可以使用finallytry/except

于 2013-10-25T14:54:25.437 回答