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('下半部分,处理数据')