python - 在 Python 中屏蔽异常?

标签 python exception

通常使用 with语句打开一个文件,这样文件句柄就不会被泄露:

with open("myfile") as f:
    …

但是,如果异常发生在 open 某处怎么办?称呼? open function 很可能不是 Python 解释器中的原子指令,因此完全有可能出现诸如 KeyboardInterrupt 之类的异步异常。会在 open 之前的某个时刻被抛出*调用已完成,但在系统调用已完成之后。

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


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

最佳答案

我不认为可以屏蔽 exceptions ,您可以屏蔽 signals 但不能屏蔽 exceptions 。在您的情况下, KeyboardInterrupt 是引发 signal.SIGINT 时引发的异常(即 Ctrl + C)。

不可能屏蔽 Exceptions 因为它没有意义,对吧?假设您正在执行 open('file','r') ,但是 file 不存在,这会导致 open 函数抛出 IOError 异常,我们不应该能够屏蔽这些类型的异常。屏蔽它没有意义,因为在上述情况下 open 永远无法完成。

exceptions – anomalous or exceptional conditions requiring special processing

对于 KeyboardInterrupt 异常,它是不同的,因为就像我说的,它实际上是一个 signal 导致引发 KeyboardInterrupt 异常。

从 Python 3.3 开始,您只能使用函数 signal.pthread_sigmask 在 Unix 中mask 信号 [Reference]

为此,您必须将 context expression 移动到不同的 block ,这样我们就可以像 mask 信号一样,运行上下文表达式来获取上下文管理器,然后 unmask signal ,示例代码看起来像(请注意我没有亲自测试过这段代码)-

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])
...

关于python - 在 Python 中屏蔽异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30929401/

相关文章:

c# - 未捕获的语法错误 : Unexpected identifier in StringBuilder

c# - WinApp 窗体崩溃,没有任何错误或异常 .Net

java - Eclipse - 像在 NetBeans 中一样处理 Java 异常

Python 导入模块在提示符下有效,但在脚本中无效

python - 为什么 np.random.default_rng().permutation(n) 优于原始 np.random.permutation(n)?

python - 在CPU为python2.7的Mac上安装Keras/Tensorflow

python - Python 中字符串格式化程序的默认舍入模式是什么?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - 在这种情况下可以从构造函数中抛出异常吗?

python - matplotlib pyplot colorbar问题