2017-10-16 104 views
2

我正在学习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

它工作正确。你能指望什么?那个例外被提出了? – Trilliput

+0

打印“尝试引发异常”后,我没有收到任何TimeoutError – Aditya

回答

0

这个异常没有被提出,因为你抓住它。注意行:

except TimeoutError as exc: 
    result = default 

块意味着,如果异常TimeoutError已经提出,result将被分配到default(这是None在你的例子)和脚本进一步继续没有表现出异常。

更新:

signal.alarm不会停止流动。所以这个异常会由于超时而产生,如果这个脚本将在try块中,那么这个异常将被捕获。如果将timeout_duration增加到3,您将会看到更好的效果。打印几条“睡眠”消息将会有更多时间。它表明,在引发异常时,解释器已进入try块。

+0

该行捕获'try'块中发生的异常,而不是尝试之前发生的异常。 – Aditya

+0

'signal.alarm'不会停止流程。所以这个异常会由于超时而产生,如果脚本将在try块中,那么异常将被捕获。你可以更好地看到,如果你将'timeout_duration'增加到3,它将如何工作。比打印几个'睡眠'消息有更多的时间。 – Trilliput