我正在使用SIGALRM信号在函数内设置超时。我从其他一些帖子开始工作,但现在我想区分SIGALM导致异常的时间与发生另一个异常的时间。我想要这个,因为实际的函数将使用subprocess.Popen从另一个模块调用。我想要的是如果有超时则将一个返回代码发送回调用模块,如果是其他异常,则返回不同的代码。这是剥离的子模块:
import sys
import time
from signal import alarm, SIGALRM, signal
def other_handler():
sys.exit(1)
def timeout_handler():
sys.exit(2)
signal(SIGALRM,timeout_handler)
try:
alarm(10)
time.sleep(5)
raise Exception('problem')
except:
if SIGALRM:
timeout_handler()
else:
other_handler()
所以,在上面的代码中,我希望调用other_handler(),但如果我将代码更改为alarm(2),我希望调用timeout_handler()。但是现在无论是什么原因导致异常执行timeout_handler()。
那么区分SIGALRM异常和任何其他异常的最佳方法是什么?
答案 0 :(得分:0)
我看到Ignacio Vazquez-Abrams的评论意味着什么。我通过在except中调用timeout_handler()来欺骗自己。它不是调用异常,而是signal()直接调用处理程序。所以代码应该是以下,并且我正在尝试完成。如果x < y,timeout_handler()被signal()调用,如果x&gt;然后我到达我的异常,这导致从异常处理中调用other_handler()。
import sys
import time
from signal import alarm, SIGALRM, signal
def other_handler():
sys.exit(1)
def timeout_handler():
sys.exit(2)
signal(SIGALRM,timeout_handler)
try:
alarm(x)
time.sleep(y)
raise Exception('problem')
except:
other_handler()