Python基础内容训练12(异常处理)

一 异常和错误的概念

在这里插入图片描述
在这里插入图片描述

二 常见的系统异常

在这里插入图片描述

  • 除零异常:1/0就会报除零异常
  • 名称异常:比如你没有定义一个名称,但是你又想print这个名称就会报错
  • 类型异常:“1”+2这是字符串加数字就会报类型异常
  • 索引异常:比如列表有两个元素,但是你用【3】来访问
  • 键异常:字典里面并没有这个key,但是你用这个key来访问
  • 值异常:将字符类型转换成int型
  • 属性异常:变量没有这个属性,但是你又访问这个属性
  • 迭代器异常:用next函数取的时候,取完就没有了,不能再next了再next就会报这个异常

在这里插入图片描述

在这里插入图片描述
三 如何解决异常

对于异常来说可以预防,就比如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方法

  • 补充
  • 上下文管理器:在一段代码上面加上一点东西,下面加上一点东西,固定好,这样前后不用变,只要变中间即可。里面有enter和exit功能
  • contextlib模板:在这里插入图片描述

有这个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)

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值