引言
系统内部一开始已经内置了一些特定的错误场景,当我们触发了这个场景时,系统内部就会向外界抛出异常。如果我们没有处理,程序就会停止运行。
解决异常
通过条件判断语句在程序内部进行容错检测,避免错误的发生。缺点: 如果要处理的错误太多,会有很多的和业务逻辑无关的代码。
捕捉异常,然后再处理
try:
# 可能出现异常的代码
# 有异常就会抛出,不会再执行剩下的 try后面的代码
except xxxError as xxx:
# 出现异常后,而且被捕捉到的代码
# except可以写多个,用来捕捉多个不同的异常
else:
# 异常未被捕捉到所执行的代码(可以省略)
finally:
# 不管有没有异常都会执行的代码
异常的合并解决
tyr:
1 / 0
print(val)
except (ZeroDivisionError, NameError) as e:
print(e)
else
print(“fine like this”)
# 执行结果:division by zero
# 如果不清楚异常的具体名字,可以写 Exception进行替代
上下文管理器
# 在主要代码的执行前后分别添加一些操作
# 实现了 __enter__(), __exit__()两个函数的类产生的对象就是上下文管理器
class Test:
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
# exc_type: 异常类型
# exc_val: 异常的值
# exc_tb: 异常追踪信息
# 函数有返回值,True表示异常已经处理,False表示异常还未处理
print(exc_val)
return True
with Test() as x: # as 后面表示对象的__enter__()方法执行后的返回值
1 / 0 # 产生的异常信息将对号入座传入__exit__()的函数参数中
# 执行结果: division by zero
# 通过 contexlib模块,通过生成器快速产生一个上下文管理器
import contexlib
# yield之前的代码相当于 __enter__()中的代码,但是返回结果要通过 yield来返回
# yield之后的代码相当于 __exit__()中的代码
@contexlib.contexmanager
def test():
print(1)
yield “x here”
print(2)
with test() as x:
print(3)
print(x)
# 执行结果:
1
3
x here
2
with语句
with open(“./xx.txt”, “r”) as f:
f.readlines()
with open(“a.jpg”, “rb”) as f1, open(“b.jpg”, “wb”) as f2:
content = f1.read()
f2.write(content)
手动抛出异常
# 通过 raise语句手动抛出异常
# 自己设计
def set_age(age):
if age <= 0 or age > 150:
raise ValueError(“value error”)
print(“age is %d” % age)
# 给别人调用
try:
set_age(-18)
except ValueError as e:
print(e)
自定义异常
# 自定义的异常要直接或间接继承自:BaseException
class MyException(Exception):
喜欢python + qun:839383765 可以获取Python各类免费最新入门学习资料!