异常处理
1.异常处理
# 异常处理
"""
程序错误分为两种:
1.语法错误 : 代码没有按照python规定的语法去写,处理不了,重写
2.异常错误 : 在代码语法正确的基础上,程序报错就是异常错误
try...except..
把所有可能错误的代码放到try代码中
如果报错,运行except代码块
所有异常类的父类 :BaseException
所有普通异常的父类 : Exception
"""
# 1.基本语法
try:
lst = [1,2,3]
print(lst[4])
except:
print("有错误")
# 2.带有分支的异常处理
try:
lst = [1,2]
print(lst[4])
print(aa)
except IndexError:
print("索引错误")
except NameError:
print("变量不存在")
except:
print("有错误")
# 3.StopIteration 捕捉到return返回值
def mygen():
yield 1
yield 2
return 888
gen = mygen()
try:
print(next(gen))
print(next(gen))
print(next(gen))
except StopIteration as e: #给类的对象起别名,e是对象
print(e,type(e)) #888 <class 'StopIteration'>
res = str(e)
print(res,type(res)) #888 <class 'str'>
res = eval(res)
print(res,type(res)) #888 <class 'int'>
# 4.其他异常处理写法
# (1) try...except...else(二选一)
"""
总结:
如果代码正确,执行else分支
如果代码有错误,执行except分支
"""
try:
lst = [1,2,3]
print(lst[1])
except:
print("有错误")
else:
print("代码正确")
# (2) try...finally...
"""
总结:
无论代码是否有错误,都执行finally代码块;
应用场景:
比如文件操作,必须遇到close()才能保存文件;一旦出现异常,必须在最后执行一次close()
数据才能保存到文件中,把fp.close()代码写在finally代码块中
"""
# (3) try ...except ... else ...finally..
print("<===============>")
try:
lst = [1,2,3]
print(lst[4])
except:
print("有异常错误")
else:
print("正确代码")
finally:
print("无论怎样,我的必须执行")
2.主动抛异常
# 主动抛异常 raise
"""
语法:
raise + 异常错误类/异常错误类对象
所有异常类的父类 :BaseException
所有普通异常的父类 : Exception
"""
# 1.抛出系统内置的异常错误类
# 简写:
try:
raise # RuntimeError
except:
print("出错了")
# 完整写法
try:
raise IndexError
except BaseException:
print("666")
# 2.自定义异常错误类
"""自定义异常错误类必须继承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_info(n):
try:
raise
except:
# 接收错误信息
return return_errorinfo(n)
class MyError(BaseException):
def __init__(self,code,msg,file,line):
self.code = code
self.msg = msg
self.file = file
self.line = line
def info(self):
for i in self.__dict__:
print(self.__dict__[i])
try:
raise MyError(404,"错误代码",get_info(2),get_info(1))
except MyError as e: #e是MyError的对象
e.info()