一、什么是异常
异常是错误发生的信号,一旦程序出错就会产生一个异常
如果该异常没有被处理,该异常就会抛出来,程序的运行随即终止
异常是由三部分组成
1、具体哪一行代码抛出的异常
2、异常的种类
NameError:变量名没有定义
IndexError:索引不存在
l = [11,22]
l[100]
KeyError
d = {"k1":11}
d["k2]
AttributeError:对象属性不存在
对.属性
ValueError
int("asdf")
TypeError
"asdf"+1111
ZeroDivisionError
1/0
3、异常的内容消息
二、为何有异常
为了增强程序的健壮性
三、如何处理异常
1、针对语法的错误:应该在程序运行前立即改正
2、针对逻辑错误
(1) 如果逻辑错误发生的条件可以预知的,应该if判断解决,预防异常。
age = input('>>: ').strip()
if age.isdigit():
age = int(age)
if age > 18:
print("too big")
elif age < 18:
print("to small")
else:
print("got it")
else:
print("必须输入数字")
(2) 如果逻辑错误发生的条件是不可预知的,那么一个异常会发生,考虑到程序的健壮性那么应该处理异常,做好补救措施
用到
try:
代码块
except 异常类型(如:NameError,KeyError):
发生异常后要执行代码
# 例一
# try:
# print("=======>111")
# print("=======>222")
# xxx
# print("======>3333")
# except AttributeError as e:
# 异常类型错误NameError: name 'xxx' is not defined
# print(e)
#
# print('======>4')
# 例二
# try:
# print("=====>111")
# print("======>222")
# xxx
# print("=====>3333") #找错下一行不运行
# except NameError as e:
# print(e)
#
# print("=====>4")
# 结果:
# =====>111
# ======>222
# name 'xxx' is not defined
# =====>4
# 例三:
# try:
# print("======>111")
# print("=======222")
# xxx # =------> name 'xxx' is not defined
# l=[]
# l[0] # =-----> list index out of range
# dic={}
# dic["k1"] # 'k1'
# print("======>333")
# except NameError as e:
# print("=------>",e)
# except IndexError as e:
# print("=----->",e)
# except (NameError,IndexError)as e:
# print(e)
# except KeyError as e:
# print(e)
# print("=======>4")
# 例四:
# try:
# print("=======>111")
# print("=====>222")
# xxx = 111
# # l = []
# # l=[0]
# # dic = {}
# # dic["k1"]
# print("======>333")
# except(NameError,IndexError)as e:
# print("=------>",e)
# except KeyError as e:
# print(e)
# finally: # 无论异常与否,都会执行该模块,通常是进行清理工作
# print("一定会运行")
# print("=====》4")
# print(xxx) # 111
# 例五:
# try:
# print("====111")
# print("====222")
# xxx
# l=[]
# l[0]
# dic = {}
# dic["k1"]
# print("=====333")
# except Exception as e: # Exception万能异常
# print(e)
# print("====444")
# 例六:
# print('====11')
# raise NameError("变量名未定义") # raise 自定义错误
# print("=====222")
# class Animal:
# def speak(self):
# raise BaseException("小垃圾必须实现speak方法来覆盖")
# def run(self):
# raise BaseException("小垃圾必须实现run方法来覆盖")
# class Dog(Animal):
# pass
# class Pig(Animal):
# pass
# d = Dog()
# p = Pig()
#
# d.speak()
# d.run()
#
# p.speak()
# d.run()
# 结果:
# raise BaseException("小垃圾必须实现speak方法来覆盖")
# BaseException: 小垃圾必须实现speak方法来覆盖
# 例七:
# class Interface(BaseException):
# def __init__(self,msg,x,y,z):
# self.msg = msg
# self.x = x
# self.y = y
# self.z = z
# def __str__(self):
# return "<%s:%s:%s:%s>"%(self,self.msg,self.x,self.y,self.z)
#
# raise Interface("接口异常",11,22,33)
# 例八:
print("=====111")
print("====2")
print(("====3"))
salaries = [1.1,2.2,1]
# if len(salaries) !=3:
# raise NameError
assert len(salaries) == 3 # 断言:assert 条件 当条件成立时,则运行下方代码,反之不运行
# print(salaries[2])
# print(salaries[2])
print(1111111)
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(("====3"))
salaries = [1.1,2.2]
# if len(salaries) !=3:
# raise NameError
assert len(salaries) == 3 # 断言:assert 条件 当条件成立时,则运行下方代码,反之不运行
# print(salaries[2])
# print(salaries[2])
print(1111111)
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])
print(salaries[2])