【 Python 基础 】S01E12异常的处理方式

0.本集概览

1.异常的默认处理和主动捕获
2.主动触发异常和自定义异常
3.try、except、else、finally、raise关键字解析
4.异常的处理流程
5.try/except/else/finally组成的几种异常处理模式

1.异常的处理方式

没错,每当在运行时检测到程序错误时,Python就会引发异常。对待异常有两种方法:一是可以在程序中捕捉和响应错误;或者忽略已发生的异常。

如果是忽略已发生的异常,Python默认的异常处理行为将启动:停止程序,打印出错消息。如果不想启动这种默认行为,就要写try语句来捕捉异常并从异常中恢复,当程序运行检测到错误时,Python会跳到try处理器,而程序在try之后会重新继续执行。

1.1.默认的异常处理器

首先来看看Python自带的默认异常处理器
代码片段:

def fetcher(obj, index):
    return obj[index]

x = 'spam'

print(fetcher(x,3))
print(fetcher(x,9))

运行结果:

m
Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 7, in <module>
print(fetcher(x,9))
 File "E:/12homework/12homework.py", line 2, in fetcher
return obj[index]
IndexError: string index out of range

从这个例子可以看到,我们试图对字符串末尾以后的位置做索引运算,当函数尝试执行obj[9]时,就会触发异常。Python会替序列检测到超出边界的索引运算,并通过抛出(触发)内置的IndexError异常进行报告。

在这个例子中,我们的代码没有刻意去捕捉这个异常,所以他会一直向上返回到程序顶层,并启用默认的异常处理器:就是打印标准出错信息,即异常发生时激活的程序行和函数清单。

1.2.主动捕获异常

那么,如果我们想自己去捕获异常呢?

因为在有些情况下,这并不是我们想要的。例如,服务器程序一般需要在内部发生错误时依然保持继续工作。如果你不想要默认的异常行为,就需要把调用封装在try语句内,自行捕捉异常。
代码片段:

def fetcher(obj, index):
    return obj[index]

x = 'spam'

try:
    fetcher(x,9)
except IndexError:
    print('got exception')

运行结果:

got exception

现在,当try代码块内程序执行触发异常时,Python会自动跳至处理器(即except分句下面的代码块)去运行。
代码片段:

def fetcher(obj, index):
    return obj[index]

x = 'spam'

try:
    fetcher(x,9)
except IndexError:
    print('got exception')
print('continue...')

运行结果:

got exception
continue...

在这个例子中,我们在异常捕捉和处理后,程序在捕捉了整个try语句后继续执行;这就是我们之所以得到continue消息的原因。我们没有看见标准出错信息,而程序也将正常执行下去。

2.异常的触发

2.1.主动触发异常

除了Python自身会产生异常以外,我们在程序中也可以主动引发异常。想要手动触发异常,可以直接执行raise语句。用户通过raise触发的异常的捕捉方式和python程序自身引发的异常一样:
代码片段:

try:
    raise IndexError
except IndexError:
    print('got exception')

运行结果:

got exception

如果没有去捕捉到异常,用户定义的异常就会向上传递,直到顶层默认的异常处理器,并通过标准出错信息终止该程序,看看,是不是感觉很熟悉。
代码片段:

raise IndexError

运行结果:

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 1, in <module>
raise IndexError
IndexError

2.2.自定义异常

我们还可以自定义异常

刚才我们利用raise语句触发了Python内置作用域中定义的一个内置异常。其实我们也可以自己定义一个新的异常,这里可能需要一点面向对象的知识,所以我们只需要了解即可:自定义的异常能够通过类来编写,它继承自一个内置的异常类:通常这个类的名称叫做Exception。
代码片段:

class Bad(Exception):
    pass

def doomed():
    raise Bad()

try:
    doomed()
except Bad:
    print('got Bad')

运行结果:

got Bad

3.finally定义收尾行为

top Created with Sketch.