欢迎来到十九分快乐的博客

生死看淡,不服就干。

19.异常处理

异常处理

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()
posted @ 2020-12-18 21:54  十九分快乐  阅读(28)  评论(0编辑  收藏  举报