文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python3:Python 异常处理以

2023-01-31 01:34

关注

try …except…else 语句

是处理异常公式, try 是有可能抛异常的代码块, except 抓取异常的类型, else 是指当没有抓到抛错,就运行这块代码。请看下下边的例子:

try:
    print("抓取的有可能的代码块")
    raise IOError
except IOError as e:
    print("except  IOError")
except OSError as e:
    print("except OSError")
else:
    print("other erro")

finally:
    print("i am  finally")
#打印结果:
抓取的有可能的代码块
except  IOError
i am  finally

从结果来看 走的路线是:
try(按照raise 的error 找except)>找到except并执行except代码块>执行finally语句块
如果没有抛错走的路线是:
try 没有error>走else 语句>finally
看来不管有没有错误, finally 语句一定会执行到。
在用到finally 要注意他会覆盖 except or else 的返回值。

def try_list():
    try:
        print("抓取的有可能的代码块")

        raise OSError
        return  1

    except IOError as e:
        print("except  IOError")
        return 2
    except OSError as e:
        print("except OSError")
        return 3
    else:
        print("other erro")
        return 4

    finally:
        print("i am  finally")
        return 5

print(try_list())
#打印结果

抓取的有可能的代码块
except  IOError
i am  finally
5

从打印的结果 ,他覆盖了 return 3。
如果走else路线同样return 的4 也会被覆盖, 自己试试下。
那小伙伴有疑问 什么情况下使用 finally 呢
答案: 是在释放资源的时候
看下边的例子。

def try_list():
    try:
        fp=open("Test。txt")
        raise OSError
        fp.close()
    except IOError as e:
        fp.close()
    except OSError as e:
        fp.close()
        print("except OSError")
    else:
        print("other erro")
        fp.close()

大家看了 吗, 只要有流程的分支的地方一定要加上这个 fp.close(),
如果再加分支,还需要再加这个close 函数。
有没有更好的解决方法吗? 答案就是 用finally。请看下边的代码:

def try_list():
    try:
        fp=open("Test。txt")
        raise OSError      
    except IOError as e:      
    except OSError as e:    
        print("except OSError")
    else:
        print("other erro")
    finally:
        fp.close()

大家看看是不是很神奇, 资源的释放不光是文件的关闭,还有socket 连接,数据库的连接

上边的内容只是复习下异常处理的内容, 下边才是重头戏 with上下文管理器

with上下文管理器

with上下文管理器协议包括两个魔法函数 1.__enter__2.exit
用实例来解释下这两个魔法函数

class Person:
    def __enter__(self):    #获取资源
        print("enter")
    def __exit__(self, exc_type, exc_val, exc_tb):   #释放资源
        print("exit")
    def said(self):
        print("said")
        
 with Person() as P:
   P.said()

打印结果是:
enter
Traceback (most recent call last):
exit
File “C:/Users/tengfei/PycharmProjects/test1/alert.py”, line 12, in
P.said()
AttributeError: ‘NoneType’ object has no attribute ‘said’

根据提示我们就知道了, 我们实例化是“NoneType” 类型,意思就是空的对象。

原因是 因为我们在获取资源(enter)没有返回值,所以默认返回的是空。
我们加上 返回值 就可以运行成功了如下:

class Person:
    def __enter__(self):  #并没有调用,也会运行这个函数
        print("enter")  
       # return  self

    def __exit__(self, exc_type, exc_val, exc_tb):   #并没有调用,也会运行这个函数
        print("exit")
    def said(self):
        print("said")

with Person() as P:
    P.said()

打印结果:
enter #并没有调用,也会运行这个函数
said
exit #并没有调用,也会运行这个函数

总结:
上下文管理器协议 是用with 进行调用,默认调用了 enter 和 exit 两个魔法函数。
with是对try…expect…finally语法的一种简化,并且提供了对于异常非常好的处理方式。
根据实际需要应用在不同的场景。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯