Exception

Python进阶之Exception

Posted by Ted on March 2, 2017

在基本术语中,我们知道try / except语句。 将可能导致异常发生的代码放在try块中,异常处理在except块中执行。 这是一个简单的例子:

try:
    file = open('test.txt', 'rb')
except IOError as e:
    print('An IOError occurred. {}'.format(e.args[-1]))

在上面的例子中,我们只处理IOError异常。 大多数初学者不知道的是,我们可以处理多个异常。

1、处理多个异常

我们可以使用三种方法来处理多个异常。 第一个涉及把可能发生在元组中的所有异常。 像这样:

try:
    file = open('test.txt', 'rb')
except (IOError, EOFError) as e:
    print("An error occurred. {}".format(e.args[-1]))

另一种方法是处理单独的except块中的个别异常。 我们可以有尽可能多的except块。 这里是一个例子:

try:
    file = open('test.txt', 'rb')
except EOFError as e:
    print("An EOF error occurred.")
    raise e
except IOError as e:
    print("An error occurred.")
    raise e

这样,如果异常不是由第一个except块处理,那么它可能由后面的块处理,或者根本不处理。

现在最后一个方法涉及所有的异常:

try:
    file = open('test.txt', 'rb')
except Exception:
    # Some logging if you want
    raise

当您不知道程序可能抛出的异常时,可以这样做。

2、finally

我们将我们的主要代码包装在try子句中。 之后,我们将一些代码包装在一个except子句中,如果在try子句中包装的代码中发生异常,except语句它将被执行。 在这个例子中,我们将使用第三个子句也就是finally子句。 无论是否发生异常,包装在finally子句中的代码将运行。 它可能被用来在脚本之后执行清理。 这是一个简单的例子:

try:
    file = open('test.txt', 'rb')
except IOError as e:
    print('An IOError occurred. {}'.format(e.args[-1]))
finally:
    print("This would be printed whether or not an exception occurred!")

# Output: An IOError occurred. No such file or directory
# This would be printed whether or not an exception occurred!

3、try/else

通常情况下,如果没有发生异常,我们也可能需要运行一些代码。 这很容易通过使用else子句来实现。 有人可能会问:为什么,如果你只想要一些代码运行,如果没有发生异常,你不会简单地把这个代码放在try中吗? 答案是,那么代码中的任何异常都会被尝试捕获,而你可能不希望这样做。 大多数人不使用它,老实说,我自己没有广泛使用它。 这里是一个例子:

try:
    print('I am sure no exception is going to occur!')
except Exception:
    print('exception')
else:
    # any code that should only run if no exception occurs in the try,
    # but for which exceptions should NOT be caught
    print('This would only run if no exception occurs. And an error here '
          'would NOT be caught.')
finally:
    print('This would be printed in every case.')

# Output: I am sure no exception is going to occur!
# This would only run if no exception occurs.
# This would be printed in every case.

else 块将会在没有异常发生时执行,并且在finally块之前执行。