python入门系列:异常处理

引言

系统内部一开始已经内置了一些特定的错误场景,当我们触发了这个场景时,系统内部就会向外界抛出异常。如果我们没有处理,程序就会停止运行。

解决异常

通过条件判断语句在程序内部进行容错检测,避免错误的发生。缺点: 如果要处理的错误太多,会有很多的和业务逻辑无关的代码。

捕捉异常,然后再处理

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 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各类免费最新入门学习资料!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190215A1AY1Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券