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 signalsignal.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])...总结
以上是内存溢出为你收集整理的掩盖Python中的异常?全部内容,希望文章能够帮你解决掩盖Python中的异常?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)