gpt4 book ai didi

python - 在 python 中,为什么在 "try except"之前和之后完成信号处理时异常存在差异

转载 作者:太空狗 更新时间:2023-10-30 01:08:59 25 4
gpt4 key购买 nike

我最近开始使用 python 。当我遇到这种行为时,我正在处理键盘中断

import signal,sys

def handleInt(sign,no):
print "interrupted"

signal.signal(signal.SIGINT,handleInt) # exception raised is IOError

try:
sys.stdin.read(1)
except IOError:
print "io interrupt"

但是如果我将信号处理更改为在 try-except 之后

import signal,sys

def handleInt(sign,no):
print "interrupted"

try:
sys.stdin.read(1)
except KeyboardInterrupt:
print "keyboard interrupt"

signal.signal(signal.SIGINT,handleInt) # exception raised is KeyboardInterrupt

当我按下 ctrl+c 时,两种情况下的异常情况有所不同。那么为什么会出现这种行为呢?

最佳答案

Python 有它自己的内置信号处理程序用于 SIGINT。此处理程序只是引发 KeyboardInterrupt。在您的第一个代码中,您将内置处理程序替换为新的处理程序,因此您会看到以下输出:

$python test_exc.py 
^Cinterrupted

请注意 io interrupted 打印,因为没有引发异常。实际上将代码修改为:

import signal,sys

def handleInt(sign,no):
print "interrupted"

signal.signal(signal.SIGINT, handleInt) # exception raised is IOError

try:
sys.stdin.read(1)
except IOError:
print "io interrupt"
else:
# else is executed only if no exception was raised
print "done"

你得到:

$python test_exc.py 
^Cinterrupted

done

请注意,按 Ctrl+C 不会阻止对 sys.stdin.read(1) 的调用,因此您仍然需要按一些让程序继续运行的关键。在信号处理程序中引发异常将引发它,就好像调用 sys.stdin.read(1) 产生它一样:

import signal,sys

def handleInt(sign,no):
print "interrupted"
raise OSError

signal.signal(signal.SIGINT, handleInt) # exception raised is IOError

try:
sys.stdin.read(1)
except IOError:
print "io interrupt"
else:
# else is executed only if no exception was raised
print "done"

样本运行:

$python test_exc.py 
^Cinterrupted
Traceback (most recent call last):
File "test_exc.py", line 10, in <module>
sys.stdin.read(1)
File "test_exc.py", line 5, in handleInt
raise OSError
OSError

注意:您可以通过 signal.default_int_handler 访问默认信号处理程序。

关于python - 在 python 中,为什么在 "try except"之前和之后完成信号处理时异常存在差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17877337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com