信号模块不引发异常

2024-10-02 06:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: todefaultsignaldeftimeoutargsresultkwargs
1条回答
网友
1楼 · 发布于 2024-10-02 06:31:36

异常尚未引发,因为您已捕获它。注意下面这句话:

 except TimeoutError as exc:
     result = default

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

更新:

signal.alarm不会停止流。因此,异常将在超时时引发,如果此时脚本将位于try块中,则将捕获异常。如果将timeout_duration增加到3,可以更好地了解它是如何工作的。这样就有更多的时间打印几条“睡眠”信息了。它显示,在引发异常时,解释器已经进入try块。在

相关问题 更多 >

    热门问题