异常处理
异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,即超出程序正常执行流程的某些特殊条件。
Python提供了两个非常重要的功能来处理程序在运行中出现的异常和错误。经常使用的是try…except语句,拓展一下就是try-except-else-finally,另一个是断言(这个后面再讲)。
try:正常情况下,程序计划执行的语句。
except:程序异常是执行的语句。
else:程序无异常即try段代码正常执行后会执行该语句。
finally:不管有没有异常,都会执行的语句。
try:
# 代码段1
pass
except name:
# 代码段2
pass
else:
# 代码段3
pass
finally:
# 代码段4
pass
函数中的异常处理
函数中的异常处理要注意return
try–>except–>finally
def test():
try :
a = 5.0 / 0.0 除数为0,异常
print('输出:我是try')
return 0
except :
print('输出:我是except')
return 1
else :
print('输出:我是else')
return 2
finally :
print('输出:finally')
return 3
print('test: ',test())
输出结果:
我是except
finally
test:3
程序在except内部虽然已经return了,但是finally依然会被执行,此时finally亦有return,则输出为finally代码段的返回值。
def test():
try :
a = 5.0 / 0.0
print('输出:我是try')
return 0
except :
print('输出:我是except')
return 1
else :
print('输出:我是else')
return 2
finally :
print('输出:finally')
print('test: ',test())
我是except
finally
test: 1
程序在except内部虽然已经return了,但是finally依然会被执行,此时finally内部没有return,则最终输出except代码段的返回值。
def test():
try :
a = 5.0 / 1.0
print('输出:我是try')
return 0
except :
print('输出:我是except')
return 1
else :
print('输出:我是else')
return 2
finally :
print('输出:finally')
return 3
print('test: ',test())
输出:
我是try
finally
test: 3
程序在try内部虽然已经return了,但是else和finally依然会被执行,此时finally有return,则输出为finally代码段的返回值。
try–>finally,返回try代码段返回值
def test():
try :
a = 5.0 / 1.0
print('输出:我是try')
return 0
except :
print('输出:我是except')
return 1
else :
print('输出:我是else')
return 2
finally :
print('输出:finally')
# return 3
print('test: ',test())
输出:
我是try
finally
test: 0
程序在try内部已经return了,else不会被执行,finally会被执行,此时finally没有return,则输出为try代码段的返回值。
try–>else–>finally,返回else代码段返回值
def test():
try :
a = 5.0 / 1.0
print('输出:我是try')
# return 0
except :
print('输出:我是except')
return 1
else :
print('输出:我是else')
return 2
finally :
print('输出:finally')
# return 3
print('test: ',test())
输出:
我是try
我是else
finally
test: 2
程序在try内部无return,else将会被执行,finally也会被执行,此时finally没有return,则输出为else代码段的返回值。
总结
1.无论有无异常,finally代码段一定会被执行
2.若有异常,则执行except代码段
3.若无异常且无return,则执行else代码段
4.若无异常且有return, try代码段中有return 语句, 则else代码段不会被执行
5.若无异常且有return, try代码段没有return语句,则else代码段会执行
给出一道简单的例题,利用异常处理处理数组超限问题
简单应用
‘’'问题描述
小明有一块空地,他将这块空地划分为n行 m 列的小块,每行和每列的长度都为 1。小
明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地。这些草长得很快,每个
月,草都会向外长出一些,如果一个小块种了草,则它将向自己的上、下、左、右四小块空
地扩展,这四小块空地都将变为有草的小块。请告诉小明,k 个月后空地上哪些地方有草?
输入格式
输入的第一行包含两个整数 n,m。
接下来 n 行,每行包含 m 个字母,表示初始的空地状态,字母之间没有空格。如果为小
数点,表示为空地,如果字母为 g,表示种了草。
接下来包含一个整数 k。其中,2<n,m<1000,1<k<1000。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
样例输入 1
4 5
.g…
…
…g…
…
2
样例输出 1
gggg.
gggg.
ggggg
.ggg.
n,m = map(int,input().split())
yard = [0 for i in range(n)] #一个列表存储原来的长草情况
new_yard=[[0 for i in range(m)]for i in range(n)] #创建一个新的列表存储遍历完一次后的情况。因为逐个遍历,直接在原列表修改的话,后边长出来的新草也会被当成原列表里的,在该次循环中错误的增值了
for i in range(n): #暂存列表获取原列表
yard[i]=list(input())
for x in range(n):
for y in range(m):
new_yard[x][y]=yard[x][y]
k = int(input())
for p in range(k):
for i in range(n):
for j in range(m):
if yard[i][j]=="g":
if i==0: #“-”处理的不能用异常处理,python列表可以用负索引
pass
else:
new_yard[i-1][j]="g"
try: #异常处理,用过的都说好
new_yard[i+1][j]="g"
except:
pass
if j==0:
pass
else:
new_yard[i][j-1]="g"
try:
new_yard[i][j+1]="g"
except:
pass
for p in range(n): #在内部遍历一次整个列表后,将暂存列表赋值给原列表,在此进行遍历
for q in range(m):
yard[p][q]=new_yard[p][q]
for i in range(n):
print("".join(yard[i]),end="") #join函数将列表转换为字符串
print("\n")
幸福从来不曾远离我们,只是有时候它会用试探的方式,看我们还在不在意。 —朱德庸