您的位置:首页 > 教程 > HTA/HTC > python上下文管理器异常问题解决方法

python上下文管理器异常问题解决方法

2021-02-08 17:56:31 来源:易采站长站 作者:

python上下文管理器异常问题解决方法,异常,抛出,文件,上下文,管理器

python上下文管理器异常问题解决方法

易采站长站,站长之家为您整理了python上下文管理器异常问题解决方法的相关内容。

对于异常的使用上,当我们在捕捉到错误时,会有一个抛出的选项让我们做决定。不过加入了上下文管理器后,就不用对异常进行选择了,因为其作用是不必抛出。下面我们就python上下文管理器处理异常进行说明,分析其中的三个参数,最后带来一个处理异常的实例供大家进行学习。

1、异常说明

异常可以在__exit__ 进行捕获并由你自己决定如何处理,是抛出还是不抛出。在__exit__ 里返回 True(没有return 就默认为 return False),就相当于告诉 Python解释器,这个异常我们已经捕获了,不需要再往外抛了。

2、参数

在 写__exit__ 函数时,需要注意的事,它必须要有这三个参数:

exc_type:异常类型 exc_val:异常值 exc_tb:异常的错误栈信息

当主逻辑代码没有报异常时,这三个参数将都为None。

3、异常实例

如果我们需要对异常做特殊处理,就可以在这个方法中实现自定义逻辑。

之所以 with 能够自动关闭文件资源,就是因为内置的文件对象实现了上下文管理器协议,这个文件对象的 __enter__ 方法返回了文件句柄,并且在 __exit__ 中实现了文件资源的关闭,另外,当 with 语法块内有异常发生时,会抛出异常给调用者。

class File:
  def __enter__(self):
    return file_obj
  def __exit__(self, exc_type, exc_value, exc_tb):
    # with 退出时释放文件资源
    file_obj.close()
    # 如果 with 内有异常发生 抛出异常
    if exc_type is not None:
      raise exception

在__exit__方法中处理异常实例扩展:

class File(object):
  def __init__(self, file_name, method):
    self.file_obj = open(file_name, method)
  def __enter__(self):
    return self.file_obj
  def __exit__(self, type, value, traceback):
    print("Exception has been handled")
    self.file_obj.close()
    return True
 
with File('demo.txt', 'w') as opened_file:
  opened_file.undefined_function()
 
# Output: Exception has been handled

以上就是关于对python上下文管理器异常问题解决方法的详细介绍。欢迎大家对python上下文管理器异常问题解决方法内容提出宝贵意见

微信扫一扫

易采站长站微信账号