程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了当资源不可用时,有效处理从 __enter__ 引发的 python 异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决当资源不可用时,有效处理从 __enter__ 引发的 python 异常?

开发过程中遇到当资源不可用时,有效处理从 __enter__ 引发的 python 异常的问题如何解决?下面主要结合日常开发的经验,给出你关于当资源不可用时,有效处理从 __enter__ 引发的 python 异常的解决方法建议,希望对你解决当资源不可用时,有效处理从 __enter__ 引发的 python 异常有所启发或帮助;

我想通过 with 管理资源,但是当该资源不可用时,我无法处理异常。我的资源是一种 FileLock 机制,可避免在将输出写入 csv 文件时并行运行的进程之间发生冲突。我的代码是这样的

data_not_to_lost  # this is a dataframe
with fileLock('database.csv'):
    data_not_to_lost.to_csv('database.csv')

我遇到的问题是有时资源不可用。发生这种情况时,fileLock 会从其 __enter__ 方法引发异常。这使得 with 块内的主要代码没有被执行(据我所知,__exit__ 方法也没有被调用)。

我对这个问题的解决方案是将整个环境包装在一对 try...except 中,如下所示:

    data_not_to_lost  # this is a dataframe
    try:
        with fileLock('database.csv'):
            data_not_to_lost.to_csv('database.csv')
    except fileLockException:
        data_not_to_lost.to_csv('BACkup.csv')

这个解决方案似乎有效,但它读起来很难看,而且很可能是一种反模式,因为:

  1. with 中的代码(在我的实际实现中更大)必须在两个不同的部分重复,因此很容易产生错误。
  2. 我明白 with 的很多方面是为了避免在多个级别链接 try ... except 子句。目前我需要两个级别(这在某种程度上很烦人,因为我的代码已经非常缩进并且每行坚持 80 个字符变得很痛苦)。

我错过了什么吗?我的“解决方案”是否是处理资源不可用时引发的异常的正确方法?

解决方法

我已经理解了很多关于 with 是为了避免在多个级别链接 try ... except 子句。

不是我的理解,我从未听说或读过这是上下文管理器的内在功能。他们的目的是管理资源。
PymOTW 说得很好:

上下文管理器负责代码块中的资源,可能在进入代码块时创建它,然后在退出代码块后清理它。

FileLock 管理的资源是锁定文件,以确保对文件的独占访问。它可以“告诉”您何时无法获得独占访问权限,但处理此类情况取决于您。
您可以尝试增加 FileLock 上的 timeout,但最终您需要一个尝试获取锁时超时的策略。

with 中的代码(在我的实际实现中更大)必须在两个不同的部分重复,因此会吸引错误。

我知道您问题中的代码只是一个精简的示例,但是如果您理所当然地不愿意重复代码部分,是否没有机会将其移动到您可以根据锁是否可以进行参数化的函数中收购与否?

def do_stuff(fileName):
    data_not_to_lost.to_csv(fileName)

try:
    with FileLock('database.csv'):
        do_stuff('database.csv')
except FileLockException:
    do_stuff('BACkup.csv')

大佬总结

以上是大佬教程为你收集整理的当资源不可用时,有效处理从 __enter__ 引发的 python 异常全部内容,希望文章能够帮你解决当资源不可用时,有效处理从 __enter__ 引发的 python 异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:异常