9.1 异常

学习Python中有关异常(bug)处理的那些事儿

当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,则就是所谓的“异常”,也就是我们常说的bug

小插曲:bug单词的诞生

早期计算机采用大量继电器工作,马克二型计算机就是这样的。

1945年9月9日,下午三点,马克二型计算机无法正常工作了,技术人员试了很多办法,最后定位到第70号继电器出错。负责人哈珀观察这个出错的继电器,

发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。“自此之后,引发软件失效的缺陷,便被称为Bug。

异常演示

例如,以r方式打开一个不存在的文件

1
f = open('test.txt','r')

执行结果:

1
Traceback (most recent call last):  File "/home/cloudlab/main.py", line 1, in <module>    f = open('test.txt','r')FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

异常的捕获

捕获常规异常:

基本语法:

1
2
3
4
try:
    可能发生错误的代码
except:
    如果出现异常执行的代码

QuickStart:

需求:尝试以r模式打开文件,如果文件不存在,则以w模式打开

1
2
3
4
try:
    f = open('test.txt','r')
except:
    f = open('test.txt','w')	# 运行发现没有报错

捕获指定异常:

基本语法:

1
2
3
4
try:
    可能发生错误的代码		
except 异常名称:
    如果出现异常执行的代码

QuickStart:

1
2
3
4
try:
    print(name)			# 如果直接运行该行代码会报错NameError
except NameError as e:	# 此处as后加变量可以把错误信息赋值给该变量,方便后面print查看等
    print('name变量名称未定义错误','错误为:'e)

捕获多个异常:

基本语法:

1
2
3
4
try:
    可能发生错误的代码
except(异常名称1,异常名称2,异常名称3):
    如果出现异常执行的代码

QuickStart:

1
2
3
4
try:
    print(1/0)
except(NameError,ZeroDivisionError) as e:
    print('出错了!','错误是:',e)

捕获全部异常:

第一种:

2.1 捕获常规异常

1
2
3
4
try:
    可能发生错误的代码
except:
    如果出现异常执行的代码

第二种:

1
2
3
4
try:
    可能发生错误的代码
except Exception as e:		# Exception可指代全部异常
    如果出现异常执行的代码

异常之else

else表示的是如果没有异常要执行的代码。

1
2
3
4
5
6
try:
    print(1)	
except Exception as e:
    print(e)
else:
    print('没有错误发生!')

异常之finally

finally表示的是无论是否异常都要执行的代码,例如关闭文件。

1
2
3
4
5
6
7
8
try:
    f = open('test.txt','r')	
except Exception as e:
    f = open('test.txt','w')
else:
    print('没有错误发生!')
finally:
    f.close()

异常的传递

解释:

无捕获时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def func01():
    print('这是func01开始')
    nmu = 1 / 0
    print('这是func01结束')

def func02():
    print('这是func02开始')
    func01()
    print('这是func02结束 ')

def main():
    func02()
main()

输出及报错内容:

这是func02开始

Traceback (most recent call last):

File "/home/cloudlab/main.py",line 13, in <module>

这是func01开始

main()

File "/home/cloudlab/main.py",line 12, in main

func02()

File "/home/cloudlab/main.py",line 8, in func02

func01()

File "/home/cloudlab/main.py",line 3, in func01

nmu = 1 / 0

ZeroDivisionError: division by zero

注意观察报错中错误所在代码行数的变化,体现了异常的传递

有捕获时:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def func01():
    print('这是func01开始')
    nmu = 1 / 0
    print('这是func01结束')

def func02():
    print('这是func02开始')
    func01()
    print('这是func02结束 ')

def main():
    try:
        func02()
    except Exception as e:
        print('检测到异常!',e)
main()

# 输出结果:
# 这是func02开始
# 这是func01开始
# 检测到异常! division by zero

输出内容:

这是func02开始

这是func01开始

检测到异常! division by zero

当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常

会传递到函数func02,当func02也没有捕获处理这个异常的时候

main函数会捕获这个异常,这就是异常的传递性.

而且代码再按步骤执行时一旦遇到异常就会立即停止接下来的步骤,除非被捕获

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS