什么是异常处理:异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那个就会抛出异常,并i企鹅程序的允许随之终止
print('1')
print('2')
print('3')
int('aaaaa')
print('4')
print('5')
print('6')
错误分两种
1 语法错误
程序执行前就要立刻改正过来
print('xxx')
if 1>2
2逻辑错误
ValueError:
int(‘aaa')
NameError
name
TypeError
.........
3 异常
强调一:对于错误发生的条件是可以预知的,此时应该用if判断去预防异常
AGE=10
age = input('>>:').strip()
if age.isdigit():
age=int(age)
age=int(age)
if age >AGE:
print("太大了")
强调二:如果错误发生的条件是不可预知的,此时应该用异常处理机制,try…except
try:
f=open('a.txt','r',encoding='utf-8')
print(next(f),end='')
print(next(f),end='')
print(next(f),end='')
print(next(f),end='')
print(next(f),end='')
print(next(f),end='')
f.close()
except StopIteration:
print('出错')
print('>>>>>>>>>11')
print('>>>>>>>>>>22')
print('>>>>>>>>>##3')
多分支:被监测的代码块抛出的异常有多种可能性,并且我们需要针对每一种异常类型都定制专门的处理逻辑
try:
print('====>1')
# name
print('=====>2')
l=[1,2,3]
# l[100]
print('=====>3')
d={}
d['name']
print('==>4')
except NameError as e:
print('=====>',e)
except IndexError as e:
print('=====>',e)
except KeyError as e:
print('=====>',e)
万能异常:Exception 被监测的代码块抛出的异常可能有多种可能性,并且我们针对所有的异常类型都只用一种逻辑就可以了,那就要Exception
try:
print('====>1')
# name
print('=====>2')
l=[1,2,3]
# l[100]
print('=====>3')
d={}
d['name']
print('==>4')
except Exception as e:
print('异常发生',e)
print('========>after code')
try:
print('====>1')
# name
print('=====>2')
l=[1,2,3]
# l[100]
print('=====>3')
d={}
d['name']
print('==>4')
except NameError as e:
print('=====>',e)
except IndexError as e:
print('=====>',e)
except KeyError as e:
print('=====>',e)
except Exception as e:
print('统一处理方法')
print('========>after code')
其他
try:
print('====>1')
# name
print('=====>2')
l=[1,2,3]
# l[100]
print('=====>3')
d={}
d['name']
print('==>4')
except NameError as e:
print('=====>',e)
except IndexError as e:
print('=====>',e)
except Exception as e:
print('统一处理方法')
else:
print('在被检测的代码块没有发生异常是执行')
finally:
print('不管被检测的代码块有无发生异常都会执行')
print('========>after code')
try:
f=open('a.txt','r',encoding='utf-8')
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
print(next(f))
finally:
f.close()
主动触发异常:raise 异常类型(值)
class People:
def __init__(self,name,age):
if isinstance(name,str):
raise TypeError('名字必须转入str类型')
if not isinstance(age,str):
raise TypeError('年龄必须传入int类型')
self.name=name
self.age=age
p=People('efon',18)
自定义异常
class MyException(BaseException):
def __init__(self,msg):
super(MyException,self).__init__()
self.msg=msg
def __str__(self):
return '<%s>'%self.msg
raise MyException('我自己的异常类型') #print obj
断言assert
info={}
info['name']='egon'
# info['age']=18
if 'name' not in info:
raise KeyError('必须有name这个key')
if 'age' not in info:
raise KeyError('必须有age这个key')
# if info['name'] == 'egon' and info['age']>18:
# print('welcome')
assert ('name' in info) and ('age' in info)