我正在尝试学习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
和
import time
def foo():
for i in range(10):
time.sleep(0.5)
print "Sleeping"
在调用函数timeoutFn(foo)
时,会打印以下内容但它会引发异常。
不应该引发TimeoutError吗?但是,所有打印的都是
Sleeping
Trying to raise exception
和程序停止。
答案 0 :(得分:0)
没有引发异常,因为你抓住了它。注意这一行:
except TimeoutError as exc:
result = default
该块意味着,如果引发了异常TimeoutError,result
将被分配给default
(在您的示例中为None
)并且脚本继续进一步显示异常。
<强>更新强>
signal.alarm
不会阻止流程。因此,异常将由超时引发,如果脚本将在try块中,那么将捕获异常。如果将timeout_duration
增加到3,您可以更好地了解它是如何工作的。将会有更多时间来打印多个“睡眠”消息。它表明,在引发异常时,解释器已进入try块。