如何在

时间:2016-06-03 16:48:10

标签: python-2.7 signals

我正在使用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异常和任何其他异常的最佳方法是什么?

1 个答案:

答案 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()