当检测到一个错误时,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函数会捕获这个异常,这就是异常的传递性.
而且代码再按步骤执行时一旦遇到异常就会立即停止接下来的步骤,除非被捕获