python学习第26天
一.认识异常处理
程序错误分为两种:语法错误 和 异常错误
语法错误:代码没有按照python规定语法去写,发明创造产生的错误
异常错误:在代码语法正确的前提下,程序报错就是异常
try...except... 基础语法 用于解决程序异常问题
raise 可以主动抛异常,异常类可以自定义
1.异常的分类
(1)IndexError 索引超出序列范围
# lst = [1,2,3,4] # print(lst[100])
(2)KeyError 字典中查找一个不存在的关键字
# dic = {"a":1,"b":2} # print(dic["c"])
(3)NameError 尝试访问一个不存在的变量
print(abc)
(4)IndentationError 缩进错误
# if 5 == 5 : # print(1) # print(2)
(5)AttributeError 尝试访问未知的对象属性
# class MyClass(): # a = 100 # obj = MyClass() # obj.abc
(6)StopIteration 迭代器没有更多的值
# it = iter(range(3)) # res = next(it) # res = next(it) # res = next(it) # res = next(it)
(7)AssertionError 断言语句(assert) 失败 用于测试领域
assert断言,就是猜,猜一猜后面的表达式是否正确
如果猜对了,什么反应也没有,如果猜错了,直接报错
if 判定时选择执行或者不执行, assert判定时选择报错或者不报错
assert 3<4 assert 3>4 # 报错 if 3<4 : pass
2.异常处理的基本语法
(1)基本语法
try...except...
把有问题的代码放到try这个代码块中
如果出现了异常,直接执行except这个代码块
作用:防止异常错误终止程序
try: lst = [1,2,3,4] print(lst[100]) except: pass # print("这里有异常错误")
(2)带有分支条件的异常处理
except + 异常错误类 特指在发生这类异常错误时,要执行的分支
try: # IndexError # lst = [1,2,3,4] # print(lst[100]) # KeyError # dic = {"a":1,"b":2} # dic["ccc"] # NameError print(abcdefg) except IndexError: print("索引超出了范围") except KeyError: print("字典的键不存在") except: print("有异常错误~")
(3)处理迭代器的异常错误
gen = mygen() # 通过try except 接收生成器函数中的返回值 try: res = next(gen) res = next(gen) res = next(gen) except StopIteration as e: """ StopIteration是异常错误类 StopIteration as e 给StopIteration这个类的对象起一个别名叫做e __str__ 当打印对象时,自动触发该魔术方法,自动接收return的返回值 """ print("迭代器取值错误,越界了") print(e)
(4) 异常处理的其他写法
1)try...finally... 不论代码是否报错,把必须要执行的代码放到finally中
try: lst = [1,2,3,4] print(lst[100]) finally: print(2) print(3) print("end结束") print(666) print(888)
- try...except... else...
如果try代码块没有报错,就执行else这个分支,如果有报错,就不执行else分支
try: # print(1) lst = [1,2,3,4] print(lst[100]) except: pass else: print("正常执行结束....")
3)for / while ...else 如果遇到break异常终止了循环,则不会执行else这个代码块
for i in range(10): print(i) if i == 5: break else: print("循环结束")
3.主动抛异常(raise)
raise + 异常错误类 or 异常错误类对象
BaseException 是所有异常类的父类(基类,超类)
Exception 是常规异常类的父类
(1)基本语法
try: # 主动抛出异常. raise BaseException except BaseException: pass # 简写 ( 默认接受的都是BaseException ) try: raise except: print(11)
(2)自定义异常类 MyException(务必继承父类BaseException)
#(了解)系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 ) def return_errorinfo(n): import sys f = sys.exc_info()[2].tb_frame.f_back if n==1: return str(f.f_lineno) #返回当前行数 elif n == 2: return f.f_code.co_filename #返回文件名 # 只有在抛出错误的时候,里面的行号和文件名才能获取到 def get_value(n): try: raise except: return return_errorinfo(n) class MyException(BaseException): def __init__(self,num,msg,line,file): # 错误号 self.num = num # 错误信息 self.msg = msg # 错误行号 self.line = line # 错误文件 self.file = file sex = "雌雄同体" try: if sex == "雌雄同体": # raise + 异常错误类对象 => 主动抛异常 raise MyException(404,"人类没有雌雄同体",get_value(1),get_value(2)) # 给MyException的类对象起别名叫做e except MyException as e: # 对象.属性 print(e.num) # 404 print(e.msg) # 人类没有雌雄同体 print(e.line)# 59 print(e.file)# E:/python30/day26/3.py