信号模块不会引发异常

时间:2017-10-16 13:38:10

标签: python python-2.7 exception exception-handling signals

我正在尝试学习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 和程序停止。

1 个答案:

答案 0 :(得分:0)

没有引发异常,因为你抓住了它。注意这一行:

 except TimeoutError as exc:
     result = default

该块意味着,如果引发了异常TimeoutError,result将被分配给default(在您的示例中为None)并且脚本继续进一步显示异常。

<强>更新

signal.alarm不会阻止流程。因此,异常将由超时引发,如果脚本将在try块中,那么将捕获异常。如果将timeout_duration增加到3,您可以更好地了解它是如何工作的。将会有更多时间来打印多个“睡眠”消息。它表明,在引发异常时,解释器已进入try块。