加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

掩盖Python中的异常?

发布时间:2020-12-20 13:50:42 所属栏目:Python 来源:网络整理
导读:通常使用with语句打开文件,以便不会泄漏文件句柄: with open("myfile") as f: … 但是如果异常发生在公开调用的某个地方呢? open函数很可能不是Python解释器中的原子指令,所以完全有可能在打开调用完成之前的某个时刻,但在系统调用完成之后,会抛出一个异步
通常使用with语句打开文件,以便不会泄漏文件句柄:

with open("myfile") as f:
    …

但是如果异常发生在公开调用的某个地方呢? open函数很可能不是Python解释器中的原子指令,所以完全有可能在打开调用完成之前的某个时刻,但在系统调用完成之后,会抛出一个异步异常,例如KeyboardInterrupt.

处理此问题的常规方法(例如,在POSIX信号中)使用屏蔽机制:在屏蔽时,异常的传递暂停,直到它们稍后被屏蔽.这允许诸如open之类的操作以原子方式实现. Python中是否存在这样的原语?

[*]有人可能会说这对于KeyboardInterrupt来说无关紧要,因为无论如何程序即将死亡,但并非所有程序都是如此.可以想象,程序可能会选择在顶层捕获KeyboardInterrupt并继续执行,在这种情况下,泄漏的文件句柄会随着时间的推移而累加.

解决方法

我认为它不可能掩盖异常,你可以屏蔽信号但不能屏蔽异常.在您的情况下,KeyboardInterrupt是引发signal.SIGINT时引发的异常(即Ctrl C).

不可能掩盖异常,因为它没有意义,对吧?假设您正在打开(‘file’,’r’),但文件不存在,这会导致open函数抛出IOError Exception,我们不应该屏蔽这些异常.掩盖它是没有意义的,因为open在以上情况下永远无法完成.

exceptions – anomalous or exceptional conditions requiring special processing

对于KeyboardInterrupt异常,它的不同之处在于,正如我所说,它实际上是一个导致引发KeyboardInterrupt异常的信号.

您只能使用函数signal.pthread_sigmask [Reference]从Python 3.3开始屏蔽Unix中的信号

为此,您必须将上下文表达式移动到另一个块,以便我们可以像屏蔽信号,运行上下文表达式以获取上下文管理器然后取消屏蔽信号,示例代码看起来像(请注意)我没有亲自测试过此代码) –

import signal
signal.pthread_sigmask(signal.SIG_BLOCK,[signal.SIGINT])
with <context expression> as variable:  # in your case,open('filename','r')

    signal.pthread_sigmask(signal.SIG_UNBLOCK,[signal.SIGINT])
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读