一 异常和错误的概念
二 常见的系统异常
三 如何解决异常
对于异常来说可以预防,就比如0不能做为除数的时候,你如果加一个判断0不为除数的时候,会使得代码很繁琐。
try:
print(name)
except NameError:
print('名称有问题,请仔细检查')
这时候不会报错,只会去走设置的异常哪里
try:
1/0
print(name)
except ZeroDivisionError as ze:
print('除数不能为0',ze)
except NameError as ne:
print('名称错误',ne)
else:
print(123)
finally:
print('最后执行的内容')
如图所示,虽然最后出现两个异常,但是优先抛出前面那个异常,优先捕获前面那个异常;as是接受异常的形参,可以print打印出来可以看到是异常的类型
就是对于文件读取操作的时候,流程一般分为三个,打开文件,读取文件,关闭文件。如果读取文件的过程中出现问题的时候,代码抛出异常,就会影响后续”文件关闭“操作的执行。
所以我们想要做一件事情就是不管这个文件有没有异常,都能正常的把文件关闭,用之前方法一的操作是下图这样,但是读取文件一般都是比较繁琐的;
with open会调用函数所产生的上下文管理器enter方法
as f 就代表enter方法里面的返回的文件对象赋值给f
with open('1.png','r') as f:
f.readlines()
执行完读操作之后会自动执行上下文管理器里面的exit方法退出
也就是说执行了f.close方法
有这个yield就是一个生成器;通过装饰器把它变成上下文管理器,也就是有进有出还有返回值
contextlib.closing是可以把有close方法的对象快速变成一个上下文管理器
class Text():
def t(self):
print('ttt')
def close(self):
print('资源释放')
import contextlib
with contextlib.closing(Text()) as t_obj:
t_obj.t()
python2.7之前还有一个功能,这里就不介绍了。
四 如何手动的抛出异常
def set_age(age):
if age <=0 or age>150:
raise ValueError('值错误')
else:
print(f'给张三的年龄设置为{age}')
set_age(-18)
def set_age(age):
if age <=0 or age>150:
raise ValueError('值错误')
else:
print(f'给张三的年龄设置为{age}')
try:
set_age(-18)
except ValueError as e:
print('x',e)
六 自定义异常
class LessZero(Exception):
def __init__(self,msg):
self.msg = msg
#描述实例对象的字符串
def __str__(self):
return "123"
def set_age(age):
if age <=0 or age>150:
raise LessZero('值错误')
else:
print(f'给张三的年龄设置为{age}')
#这个e就是上面raise后面的对象,直接printe就是获取e的str方法
#所以返回值是123
try:
set_age(-18)
except LessZero as e:
print('x',e)