一:什么是异常?
异常时错误发生的信号,一旦程序出错 就会产生一个异常。
如果该异常没有被处理,该异常就会被抛出来,程序的运行随即终止。
异常组成的3部分
1.Traceback:异常的追踪/回溯信息,定位到哪一行代码抛出了问题
2.XXXError:异常的种类
3.XXXError后的内容:异常的内容信息
错误的2种方式:
①语法错误(SyntaxError):缺少:
或者(
等语法错误。
②逻辑错误(Name/Index/Key Error):变量未定义就直接使用等逻辑错误。
# 逻辑错误
NameError:变量名未定义
x = 1
print(y)
IndexError:索引不存在
l = [1,2,3]
print(l[100])
KeyError:键不存在
d = {'k1':'asd'}
print(d['a'])
AttributeError:对象的属性不存在
对象.属性
TypeError:类型错误
'asd'+111
二:为何要处理异常?
1.为了增强程序的 健壮性(鲁棒性),即便是程序运行过程中出错了,也不要终止程序
2.而是捕捉异常并处理:将出错信息记录到日志内
三:如何处理异常
1.针对 语法的错误:应该在程序运行前,立即改正
2.针对 逻辑的错误:例如先定义,后使用
,要尽量避免
3.如果逻辑错误发生的条件是可以预知的,应该用if
判断拿来解决,预防异常
4.如果逻辑错误发生的条件是不可预知的,那么异常一定会发生,考虑带程序的健壮性,我们应该处理异常,做好补救措施(能不写尽力不写)
try:
代码块
except 异常的类型:
发生异常后要执行的代码
四:例子
1.遇到异常,程序直接终止
try:
print("====>111")
print("====>222")
xxx
# 遇到异常后,程序直接退出,后面的代码不会执行
print("====>333")
except AttributeError as e:
print(e)
print('====>4')
# 输出:
# NameError: name 'xxx' is not defined
# ====>111
# ====>222
2.指定异常
try:
print("====>111")
print("====>222")
xxx
print("====>333")
except NameError as e: # 指定异常的类型(需要知道会抛出哪些异常)
print(e)
print('====>4')
# 输出
# ====>111
# ====>222
# name 'xxx' is not defined
# ====>4
3.合并抛出异常
try:
print("====>111")
print("====>222")
# xxx
l=[]
l[0]
dic = {}
# dic["k1"]
print("====>333")
except (NameError, IndexError) as e: # 可以将2种异常合并输出
print("=---->", e)
except KeyError as e:
print(e)
print('====>4')
# 输出
# ====>111
# ====>222
# =----> list index out of range
# ====>4
4.finally
不管有无异常,都会输出
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')
# 输出:
# ====>111
# ====>222
# ====>333
# 一定会运行
# ====>4
5.万能异常Exception
try:
print("====>111")
print("====>222")
# xxx
l = []
# l[0]
dic = {}
dic["k1"]
print("====>333")
except Exception as e: # 万能异常,可以接收任何类型的异常
print("万能异常", e)
print('====>4')
# 输出:
# ====>111
# ====>222
# 万能异常 'k1'
# ====>4
6.自定义异常
print('==>11')
raise NameError("变量名未定义")
print('==>222')
# 输出:
# NameError: 变量名未定义
class Animal:
def speak(self):
raise BaseException("小垃圾必须实现speak方法来覆盖")
class Dog(Animal):
pass
d = Dog()
d.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.msg, self.x, self.y, self.z)
raise Interface("接口异常", 11, 22, 33)
# 输出:
# __main__.Interface: <接口异常:11:22:33>
7.断言assert
print("====1")
print("====2")
print("====3")
salaries = [1.1, 2.2]
# if len(salaries) != 3:
# raise NameError
assert len(salaries) == 3
print(salaries[2])
# 输出:
# AssertionError
# ====1
# ====2
# ====3