异常处理
一、认识异常处理
程序错误分为两种: 语法错误和异常错误
语法错误:代码没有按照python规定语法去写,发明创造产生的错误
异常错误:在代码语法正确的前提下,程序报错就是异常
1、IndexError报错
超出索引范围
lst = [1,2,3,4]
print(lst[100])
运行结果:
2、KeyError报错
字典中查找一个不存在的关键字
dic={"key1":"value1","key2":"value2"}
res=dic["key3"]
print(res)
运行结果:
3、NameError报错
尝试访问一个不存在的变量
name="Lsir"
print(age)
运行结果:
4、IndentationError报错
缩进错误
name="Lsir"
print(name)
运行结果:
5、AttributeError报错
尝试访问未知的对象属性
class MyClass():
name="Lsir"
obj=MyClass()
obj.age()
运行结果:
6、StopIteration报错
迭代器没有更多的值:
def mygen():
yield 1
yield 2
yield 3
return 4
it=mygen()
for i in it:
print(i)
res=next(it)
print(res)
运行结果:
7、AssertionError报错
断言语句失败
assert 3>10
运行结果:
二、异常处理的基本语法
1、基本语法
try … except …
把有问题的代码放到try这个代码块中
如果出现了异常会直接执行except这个代码块中的内容
作用:防止异常报错,终止程序
try:
lst=[1,2,3]
print(lst[100])
except:
print("存在异常报错")
运行结果:
2、带有分支的异常处理
except + 异常错误类 特指发生在这类错误时,要执行的分支
try:
dic={"key1":"value1"}
lst=[1,2,3]
print(dic["key2"])
except IndexError:
print("超出索引范围")
except KeyError:
print("不存在的关键字")
运行结果:
3、处理迭代器异常错误
try:
def mygen():
yield 1
yield 2
yield 3
return 4
it=mygen()
res1=next(it)
print(res1)
res2=next(it)
print(res2)
res3=next(it)
print(res3)
res4=next(it)
print(res4)
except StopIteration as e:
print(e)
print("程序执行完毕")
运行结果:
代码分析:
正常来讲,上述迭代器迭代到第四次时会产生StopIteration报错,但我们使用了try…except…进行分支处理,在StopIteration中,当我们print对象时会自动触发类中的__str__魔术方法,将返回值打印出来
三、主动抛出异常
raise + 异常错误类 or 异常错误类对象
BaseException 所有异常类的父类
Exception 常见异常类的父类
1 、基本语法
try:
raise BaseException
except BaseException:
pass
运行结果:
简写:
try:
raise
except:
pass
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 #返回文件名
# 通过get_value 主动抛出异常
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
info="error"
try:
if info == "error":
raise MyException(404,"告警级别error",get_value(1),get_value(2))
except MyException as m:
print(m.num)
print(m.msg)
print(m.line)
print(m.file)
运行结果: