引言

使用上下文管理器,可以让代码更加优雅简洁。当然,上下文的管理器的作用不止于此,它内部的实现机制,能很好的处理代码异常,提升代码的复用性

1、先看看最简单的例子,with语句

# 创建一个文件写入字符串“Python”
f = open('123.txt', 'w')
f.write("python")
f.close()
# 使用with语句调用上下文实现文件写入操作
with open('123.txt', 'w') as f:
    f.write('python')

2、什么是上下文管理器?

上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境,比如在文件操作时,文件需要打开关闭,而文件读写操作就处于文件操作的上下文环境中;

上下文管理器,上下文管理器是指在一段代码执行之前,执行一些预处理的工作,代码执行之后再执行一些清理工作。

上下文管理器中有enter()和 exit() 两个方法,enter()方法在执行 with 后面的语句时执行,一般用来处理操作前的内容,比如一些创建对象,初始化等; exit() 方法在 with 内的代码执行完毕后执行,一般用来处理一些善后收尾工作,比如文件的关闭,数据库的关闭等。

3、上下文管理器的原理过程如下:

  • 调用enter()方法,进行预处理操作
  • 执行用户操作
  • 调用 exit() 方法,完成清理操作

4、上下文管理器的应用场景:

资源管理功能,即文件处理、网络连接、数据库连接等操作时需要关闭资源。

也可以在代码执行前后增加功能,类似于装饰器,比如代码之前做权限验证等。

4.1 数据库连接

import pymysql
class DBConnection(object):
    def __init__(self,ip,user,passwd,db):
        self.ip = ip
        self.user = user
        self.passwd = passwd
        self.db = db
    def __enter__(self):
        self.conn = pymysql.connect(self.ip, user=self.user, passwd=self.passwd, db=self.db)
        self.cur = conn.cursor()
        return self.cur
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cur.close()
        self.conn.close()
with DBConnection('192.168.121.xxx', user="xxx", passwd="123456", db="xxx") as cur:
    cur.execute("select * from studnet;")
    result = cur.fetchall()
    print(result)

完成DBConnection这个类,每次连接数据库时,只要简单的调用with语句即可,不需要关心数据库的关闭、异常等

4.2上下文管理器的异常处理

class MyOpen(object):
    """自定义上下文管理类"""
    def __init__(self, file, mode):
        self._file = file
        self._mode = mode
    def __enter__(self):
        self._handle = open(self._file, self._mode)
        return self._handle
    def __exit__(self, exc_type, exc_val, exc_tb):
        # print('Type: ', exc_type)
        # print('Value:', exc_val)
        # print('TreacBack:', exc_tb)
        self._handle.close()
        print("异常已被处理")
        return True
# 读的模式打开文件,进行写操作,不支持
with MyOpen('123.txt', 'r') as f:
    f.write('python')
#输出:
异常已被处理

with 语法不仅可以简化资源操作的后续清除操作,还可以代替 try/finally 进行异常处理

当with中执行的语句发生异常时,异常信息会被发送到 exit()方法的参数中, exit() 方法有如下三个参数:

  • exc_type : 异常类型
  • exc_val : 异常值
  • exc_tb : 异常回溯追踪

这三个参数都与异常有关,with语句会把异常的exc_type ,exc_val 和exc_tb传递给 exit() 方法,它让exit() 方法来处理异常 ,如果exit()返回的是True,那么这个异常就被忽略,并按照我们定义的方式进行抛出。如果exit()返回的是True以外的任何东西,那么这个异常将被with语句抛出。

以上就是python上下文管理器使用场景及异常处理的详细内容,更多关于python上下文管理器异常处理的资料请关注Devmax其它相关文章!

python上下文管理器使用场景及异常处理的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. ios – 使用swift进行异常处理

    catch来处理它.如果故事板中没有视图控制器,则无法执行任何操作.这是程序员的错误,创建它的人应该处理这些问题.你不能因为这种错误而责怪iOS运行时.

  3. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. Swift41/90Days - 面向轨道编程 - Swift 中的异常处理

    问题在开发过程中,异常处理算是比较常见的问题了。我们把下面那根Failure的线路扩展一下,便会看到两条平行的线路,这便是“双轨模型”,这是用“面向轨道编程”思想解决异常处理的理论基础。这就是“面向轨道编程”。也就是说具体的业务只需要处理灰色部分的逻辑:“面向轨道”编程确实给我们提供了一个很有趣的思路。比如ValueTransformation.swift这个真实的完整案例,以及antitypical/Result这个封装完整的Result库。面向铁轨,春暖花开。

  5. 面向轨道编程 - Swift 中的异常处理

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  7. swift详解之十-------------异常处理、类型转换 ( Any and AnyObject )

    异常处理、类型转换注:本文为作者倾心整理,希望对大家有所帮助!在swift中,错误用复合ErrorType协议的值表示。swift处理异常和别的语言不同的是swift不会展开调用堆栈。在swift中throw语句的性能几乎和return一样通过try!所以上面的例子还能这么写结果是一模一样的Any和AnyObject的类型Swift为不确定类型提供了两种特殊类型别名:AnyObject可以代表任何class类型的实例。Any可以表示任何类型,包括方法类型。

  8. Swift2网络操作和异常处理

    相信写过Swift的人应该都知道Alamofire,它是AFNetworking的Swift版本,同一个作者写的。"的哲学,不过Swift一直很强调安全性,Apple显然也并不仅仅满足于让Swift困守iOS开发领域,加上早就公布了年底要开源,大家也很期待它作为一门通用编程语言在其他领域的作为。从各方面来看,Swift2.0增加了对异常处理的支持都在情理之中。在我看来异常处理最重要的用途有两点:写底层框架的时候可以抛出一些异常让框架的使用者去处理,这样框架会显得更加灵活。

  9. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  10. Swift 2.0 异常处理

    WWDC2015宣布了新的Swift2.0.这次重大更新给Swift提供了新的异常处理方法。在Swift中,guard有点像if但是他们有两个非常重要的区别guard必须强制有else语句只有在guard审查的条件成立,guard之后的代码才会运行。所以,使用catch你可以对异常的解析进行更为高级的处理7MyError.NotExist{//dealwithnotexistMyError.OutOfRange{//dealwithnotexist}这里值得提一下在Swift2.0中一个跟异常处理没有关系

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部