【python学习笔记】异常处理

什么是异常
异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会
抛出该异常,程序的运行也随之终止)

语法错误:不按照语言基准来写

print('hello'

逻辑错误

res = 1/0 #ZeroDivisionError

l = [1.2]
l[10] #IndexError

age = input('>>:')
age = int(age) #如果输入字符串就会报错

异常种类
ZeroDivisionError
IndexError等。。。。。。

异常结构
Traceback->python解释器追踪的异常信息 例如:NameError->异常类  NameError后面的是异常值

异常处理
为了保证程序的健壮性与容错性,即在遇到错误时程序不会崩溃,我们需要对异常进行处理

->使用if判断:

针对错误发生的条件是可预知的,在错误发生之前预防

#例1
num1 = input('请输入数字:')

if num1.isdigit():
	int(num1) #主逻辑
elif num1.isspace():
	print('输入的是空格')
elif num1.isalpha():
	print('输入的是字母')
elif len(num1) == 0:
	print('输入的是空')
else:
	print('其他非法输入')
#例2
def test():
	print('test running')
choice_dict = {
	'1':test
}
while True:
	choice = input('-->>:').strip()
	if not choice or choice not in choice_dict:
		continue
	choice_dict[choice]()	
缺点:
①如果有其他num。。数量多的话,会造成重复代码以及可读性很差
②不同代码段的相同类型的错误需要写重复的if来进行处理,造成重复代码
③与主程序本身无关,与异常处理有关的if太多,造成可读性太差

python为每一种异常定制了一个类型,提供了try.except特殊的语法结构来进行异常处理

->使用try.except:
若错误发生的条件是不可预知的,可以使用try..except..语句来捕捉异常

#基本语法结构
try:
	被检测的代码块
except:
	try中一旦检测到异常,就执行这个位置的逻辑
	
#异常类只能用来处理指定的异常情况,如果非指定异常则无法处理
try:
	age = input('-->>:')
	int(age) #主逻辑
	#这两个发生异常的类型一样:ValueError
	num1 = input('-->>:')
	int(num1) #主逻辑
except ValueError as e:
	print(e)  #报异常ValueError
#->若except后面的异常类型是KeyError,上面的异常捕捉不了,会正常报错

#多分支
try:
	age = input('-->>:')
	int(age) #主逻辑

	#这两个发生异常的类型一样:ValueError
	num1 = input('-->>:')
	int(num1) #主逻辑

	l = []
	l[100]

	dic = {}
	dic['name']
except KeyError as e:
	print(e)
except ValueError as e:
	print(e)
except IndexError as e:
	print(e)

#万能异常 Exception
try:
	age = input('-->>:')
	int(age) #主逻辑

	#这两个发生异常的类型一样:ValueError
	num1 = input('-->>:')
	int(num1) #主逻辑

	l = []
	l[100]

	dic = {}
	dic['name']
except Exception as e:
	print(e)

#多分支与万能异常
1.无论什么异常统一处理,一般使用Exception
2.对于不同的异常需要定制不同的处理逻辑,使用多分支

#加上while循环,可以让主程序重复不断的运行,直到不报异常为止
while True:
	try:
		age = input('-->>:')
		int(age) #主逻辑
		break
	except Exception as e:
		print('请重新输入',e)
		
print('终于出来了')

#多分支后面加万能异常
try:
	age = input('-->>:')
	int(age) #主逻辑

except KeyError as e:
	print(e)
except ValueError as e:
	print(e)
except IndexError as e:
	print(e)
except Exception as e: #上面异常类型都没有捕捉到时,捕捉剩余其他异常
	print(e)
	
#其他异常结构 else
try:
	age = input('-->>:')
	int(age) #主逻辑
except KeyError as e:
	print(e)
except ValueError as e:
	print(e)
except IndexError as e:
	print(e)
except Exception as e:
	print(e)
else:
	print('try内代码块没有异常时运行')

#其他异常结构 finally
try:
	age = input('-->>:')
	int(age) #主逻辑
except KeyError as e:
	print(e)
except ValueError as e:
	print(e)
except IndexError as e:
	print(e)
except Exception as e:
	print(e)
else:
	print('try内代码块没有异常时运行')
finally:
	print('无论异常与否,都会执行该模块,通常是进行清理工作')
#例如:文件操作时触发异常,文件未关闭,使用finally进行文件关闭

#主动触发异常
try:
	raise TypeError('类型错误')
except Exception as e:
	print(e)

#自定义异常
class MrhException(BaseException): #自定义类基于BaseException
	def __init__(self,msg):
		self.msg = msg
	def __str__(self):
		return self.msg

#raise MrhException('自己定制的异常')
#print(MrhException('自己定制的异常'))  #触发str方法,打印异常信息
#直接触发异常类
raise TypeError('类型错误')  #TypeError: 类型错误

#断言
#语法结构:assert 条件
assert 1 == 2  #AssertionError
#相当于下面两行代码
if x != 1:
	raise AssertionError

try..except优点:
① 将异常处理和主程序区分开
② 异常可以进行捕捉,程序不容易直接意外崩溃

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值