异常处理

129 阅读2分钟

异常简介

1.如何理解异常
	异常就是bug,程序运行中如果出现,会导致整个程序的结束
2.异常的结构
	Traceback (most recent call last):
  	File "D:/pythonProject/day21/02 异常的结构.py", line 13, in <module>
    name
	NameError: name 'name' is not defined
    2.1.关键字line:提示报错所在的行数
    2.2.最后一行冒号左侧:提示报错类型
    2.3.最后一行冒号右侧:错误的具体原因
3.异常的分类
	3.1.语法错误:(SyntaxError)
    	绝不允许出现,一旦出现请立即修改
	3.2.逻辑错误:(NameError,IndexError,KeyError,TypeError等)        
    	允许出现,出错之后改正即可

异常捕获

1.异常捕获就相当于是提前预测代码可能出现的问题,并给出应急处理措施(打预防针).异常捕获能少用就少用。
2.一般是当我们不确定代码是否报错的情况下,需要自己写代码处理异常。
3.代码实现
    3.1基本的语法结构:        
        try:
            可能会出错的代码(被try监控)
        except 错误类型1 as e:
            对应错误类型1的处理措施
        except 错误类型2 as e:
            对应错误类型2的处理措施
        例如:
        """
        try:
            name
        except NameError as e:
            print('123')
        """        
    3.2.万能异常    
        上面的处理方式需要我们提前预判出可能出现的错误类型,但有时候我们也不知道会报什么错,以下就是更为笼统的通用解决方式:
        try:
            可能会出错的代码(被try监控)
        except Exception as e:
            对应错误的处理措施
        
4.捕获异常的其他操作补充
    4.1.  elsefinally
        try:
            可能会出错的代码(被try监控)
        except Exception as e:
            对应错误的处理措施
        else:
            检测的代码没有出错的情况下,执行else后的代码
        finally:
            无论被检测代码报不报错,都会执行finally代码
	4.2.  断言(assert)
    	name = 'jason'
        assert isinstance(name, str)  # 断言参数1的数据是否属于参数2的类型,是则执行下面代码,不是则报错
        print('jason is here')
	4.3.  主动抛出异常(raise)  
    	name = input('username>>>:').strip()
		if name == 'jason':
			# raise NameError('jason来了 快跑!!!')
			raise Exception('反正就是不能过')
        else:
			print('不是jason 那没事了')
 

异常实操


# 需求:使用while+异常捕获实现for循环的功能
    l1 = [1,2,3,4,5,6]
    l1 = l1.__iter__()  # 将列表转换成迭代器对象
    while True:
        try:
            print(l1.__next__())  # 迭代取值到最后一个会报错,所以用try检测
        except Exception as e:
            break  # 处理异常的措施
            
for循环的本质:            
语法结构
	for 变量名 in 可迭代对象:
        for循环体代码
1.for会自动将in后面的数据调用__iter__()变成迭代器对象
2.之后每次循环调用__next__()取值
3.最后没有值__next__()会报错 for能够自动处理该错误 让循环正常结束