我正在学习python的信号模块。请考虑以下示例:
def timeoutFn(func, args=(), kwargs={}, timeout_duration=1, default=None):
import signal
class TimeoutError(Exception):
pass
def handler(signum, frame):
print "Trying to raise exception"
raise TimeoutError
# set the timeout handler
signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout_duration)
try:
result = func(*args, **kwargs)
except TimeoutError as exc:
result = default
finally:
signal.alarm(0)
return result
而且
^{pr2}$在调用函数timeoutFn(foo)
时,将打印以下内容,但它确实引发了异常。在
它不应该增加超时误差吗?但是,所有的指纹都是
Sleeping
Trying to raise exception
程序停止。在
异常尚未引发,因为您已捕获它。注意下面这句话:
该块意味着,如果引发了异常TimeoutError,
result
将被分配给default
(在您的示例中是None
),并且脚本继续执行而不显示异常。在更新:
signal.alarm
不会停止流。因此,异常将在超时时引发,如果此时脚本将位于try块中,则将捕获异常。如果将timeout_duration
增加到3,可以更好地了解它是如何工作的。这样就有更多的时间打印几条“睡眠”信息了。它显示,在引发异常时,解释器已经进入try块。在相关问题 更多 >
编程相关推荐