1,什么是异常处理,
异常时错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会被跑出,程序的执行也会随之终止
异常包含三个部分:
1>,traceback异常的追踪信息
2>,异常的类型
3>,异常的信息
错误分为两大类:
1>,语法上的错误:在程序隐形前就应该立即修正
2>,逻辑上的错误
- 当我们可以预知程序发生错误的条件,应该用if判断去规避错误
- 当我们无法预知程序发生错误的条件,也就是说错误一定会发生,那么我们应该用try...except去补救
3,为何要异常处理
避免程序因为异常而崩溃,所以在应用程序中应该对异常进行处理,从而增强程序的健壮性
try:
代码1
代码2
代码3
except NameError:
当抛出的异常时NameError时执行的子代码块
except ......:
pass
except Exception:
万能异常,不管抛出的是什么异常信息,上面没有接收的,这个都能接收
else:
当执行的代码没有抛出异常时需要执行的代码块
finally:
执行的代码不管有没有异常都需要执行的代码
(一)异常处理单分支
try:
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
d['z'] # KeyError
print('=====4')
l = [1, 2, 3]
l[1000] # IndexError
print('=====5')
except IndexError:
print('IndexError')
print('other code')
(二)异常处理多分支
try:
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
d['z'] # KeyError
print('=====4')
l = [1, 2, 3]
l[1000] # IndexError
print('=====5')
except KeyError as e: # e是异常信息捕获
print('KeyError',e)
except IndexError as e:
print('IndexError',e)
print('other code')
(三)万能异常类型
try:
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
# d['z'] # KeyError
# xxx
print('=====4')
l = [1, 2, 3]
l[1000] # IndexError
print('=====5')
except IndexError as e:
print('IndexError:', e)
except KeyError as e:
print('KeyError:', e)
except Exception as e: #万能异常
print('Exception:',e)
print('other code')
(四)try...else
try:
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
# d['z'] # KeyError
# xxx
print('=====4')
l = [1, 2, 3]
# l[1000] # IndexError
print('=====5')
except IndexError as e:
print('IndexError:', e)
except KeyError as e:
print('KeyError:', e)
except Exception as e:
print('Exception:',e)
else:
print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
print('other code')
(五)try....finally
try:
f=open('a.txt','w')
print('=====1')
print('=====2')
print('=====3')
d = {'x': 1, 'y': 2}
# d['z'] # KeyError
# xxx
'xx' > 10
print('=====4')
l = [1, 2, 3]
# l[1000] # IndexError
print('=====5')
except IndexError as e:
print('IndexError:', e)
except KeyError as e:
print('KeyError:', e)
# except Exception as e:
# print('Exception:',e)
else:
print('else必须放到后面,else的子代码块会在被检测的代码没有异常的情况下执行')
finally:
print('无论被检测的代码有没有异常都会执行')
f.close()
(六)主动触发异常:
print('===>1')
print('===>2')
raise TypeError('类型错误') #raise互动抛出异常
print('===>3')
class People:
def __init__(self,name,age):
self.__name=name
self.__age=age
def tell_info(self):
print(self.__name,self.__age)
def set_info(self,name,age):
if not isinstance(name,str):
raise TypeError('名字必须是str类型')
if not isinstance(age,int):
raise TypeError('年龄必须是int类型')
self.__name=name
self.__age=age
obj=People('egon',18)
# print(obj.__dict__)
# obj.tell_info()
obj.set_info('egon',123)
obj.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('下半部分,处理数据')