捕获上下文管理器中threading.Timer引发的异常

吉尔

我写了一个简单的TimeManager:上下文管理器,threading.Timer当上下文进入时将触发,在退出时将其取消。如果计时器在退出上下文之前关闭,则会引发异常:

import threading

class TimeManager(object):
    def __init__(self):
        self._timeout = 1

    def _timeoutHandler(self):
        raise Exception("Timeout!")

    def __enter__(self):
        self.timer = threading.Timer(self._timeout, self._timeoutHandler)
        self.timer.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.timer.cancel()
        return False

显然,我无法在主线程中捕获异常,因为它属于一个单独的线程:

>>> with TimeManager() as t:
...   try:
...     time.sleep(5)
...   except Exception:
...     print "caught"
... 
Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python2.6/threading.py", line 532, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.6/threading.py", line 736, in run
    self.function(*self.args, **self.kwargs)
  File "<stdin>", line 5, in _timeoutHandler
Exception: Timeout!

那么,如何在主线程中捕获异常?我应该放弃上下文管理器的想法吗?

请注意,该问题与此处描述的问题不同,这里没有涉及多个线程。认为这也是从不同的,在消息传递将否定超时的目的。

损害

有一个名为的模块stopit,它使用线程或信号提供可中断的上下文管理器。但是,每种方法都有其自身的局限性。例如,使用线程,您实际上无法中断阻塞调用(例如time.sleep)。信号可以但仅在Unix上可用,并且在多线程应用程序中使用并不安全。

看起来它利用了C-API函数PyThreadState_SetAsyncExc来在所需线程中异步引发异常。

这是用法示例(取自他们的文档):

>>> import time
>>> def variable_duration_func(duration):
...     t0 = time.time()
...     while True:
...         dummy = 0
...         if time.time() - t0 > duration:
...             break
>>>
>>> start_time = time.time()
>>> with Timeout(2.0) as timeout_ctx:
...     variable_duration_func(5.0)
>>> time.time() - start_time < 2.2
True
>>> timeout_ctx.state == timeout_ctx.TIMED_OUT
True

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在上下文管理器中捕获异常?

来自分类Dev

在上下文管理器中处理异常

来自分类Dev

python上下文管理器不传递异常

来自分类Dev

如何在上下文管理器的__exit__中处理异常?

来自分类Dev

在Python2.7上下文管理器类中处理异常的正确方法

来自分类Dev

如何在上下文管理器中安全处理异常

来自分类Dev

如何在上下文管理器中抑制给定的异常?

来自分类Dev

Python3。如何在上下文管理器中正确引发异常以使用运算符处理该异常?

来自分类Dev

在上下文处理程序中重新引发异常

来自分类Dev

在触发器内引发时Supress / filter异常上下文

来自分类Dev

在python中调用上下文管理器

来自分类Dev

在python中调用上下文管理器

来自分类Dev

捕获异常并引发相同?

来自分类Dev

未引发捕获异常

来自分类Dev

空捕获,但仍引发异常

来自分类Dev

上下文管理器反向

来自分类Dev

异步上下文管理器

来自分类Dev

捕获任务中引发的异常?

来自分类Dev

在Python中引发异常

来自分类Dev

在PostgreSQL中引发异常

来自分类Dev

ZMQ python套接字从上下文捕获异常

来自分类Dev

引发并捕获异常,或使用instanceof?

来自分类Dev

捕获从异步lambda引发的异常

来自分类Dev

需要帮助来设置后台管理对象上下文。在FRC控制器上获取异常

来自分类Dev

如何捕获在JsonConverter属性中引发的异常?

来自分类Dev

捕获导入模块中引发的异常

来自分类Dev

备份捕获EventHandler中引发的异常

来自分类Dev

无法捕获PHP中引发的COM异常

来自分类Dev

如何测试在junit中引发并捕获了异常