1. 什么是异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常 没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止 异常包含三个部分: 1. traceback异常的追踪信息 2. 异常的类型 3. 异常的信息 错误分为两大类: 1. 语法上的错误:在程序运行前就应该立即修正 2. 逻辑上的错误 2. 为何要异常处理 避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性 3. 如何异常处理 try: 代码1 代码2 代码3 ...... except NameError: 当抛出的异常是NameError时执行的子代码块 except ....: pass except ...: pass else: pass finally: pass
else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行
finally无论被检测的代码有没有异常都会执行
=============================================================
try: print('=====>1') print('=====>2') print('=====>3') l=[1,2,3,4,5] #IndexError l[10] print('=====>4') aaa #nameError print('=====>5') '1'>1 #TypeError print('=====>6') except IndexError: print('IndexError') except TypeError: print('TypeError') except Exception: print('Exception') else: print('没毛病(没有异常才能执行)') finally: print('有毛病也执行(有没有异常都执行)') print('end')
万能异常类型Exception:可以匹配任意类型的异常
============================================================== 常见异常类型:
print('dadada' #SyntaxError: unexpected EOF while parsing l=[1,2,3,4,5] #IndexError: list index out of range l[10] xxx #NameError: name 'xxx' is not defined l={'a':1,'b':2} #KeyError: 'c' l['c'] 'a'>1 #TypeError: '>' not supported between instances of 'str' and 'int' for i in 10 #SyntaxError: invalid syntax 1/0 #ZeroDivisionError: division by zero ====================================================================== 主动触发异常:
class People: def __init__(self,name,age): self.__name=name self.__age=age def tell_info(self): print(self.__name,self.__age) def set(self,name,age): if not isinstance(name,str): raise TypeError('name必须是str类型') if not isinstance(age,int): raise TypeError('age必须是int类型') self.__name=name self.__age=age peo1=People('qqq',10) # print(peo1.__dict__) # peo1.tell_info()
================================================================== 了解:
自定义异常类型(了解) class MyException(BaseException): def __init__(self,msg): super().__init__() self.msg=msg def __str__(self): return '<%s>' %self.msg raise MyException('我自定义的异常')
断言(了解) print('上半部分,生产数据') l=[1,2,3,4] # if len(l) != 5: # raise TypeError('列表的长度必须为5') assert len(l) == 5 print('下半部分,处理数据')