python异常处理

本文详细介绍了Python中的异常处理机制,包括try-except-else-finally语句的用法,以及在函数中的异常处理规则,通过实例展示了如何处理程序运行时的异常并控制代码流程。
摘要由CSDN通过智能技术生成

异常处理

异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况,即超出程序正常执行流程的某些特殊条件。

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")

幸福从来不曾远离我们,只是有时候它会用试探的方式,看我们还在不在意。 —朱德庸

  • 31
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值