从定时器捕获异常

Mel*_*lon 5 python exception timer watchdog

我正在尝试创建一个看门狗类,它将在指定时间后抛出异常:

from threading import Timer
from time import sleep

class watchdog():
  def _timeout(self):
    #raise self
    raise TypeError

  def __init__(self):
    self.t = Timer(1, self._timeout)

  def start(self):
    self.t.start()

try:
  w = watchdog()
  w.start()
  sleep(2)
except TypeError, e:
  print "Exception caught"
else:
  print "Of course I didn't catch the exception"
Run Code Online (Sandbox Code Playgroud)

该异常未被捕获,因为该异常是从完全不同的上下文引发的,因此我们将看到最后一条消息。

我的问题是,如何修改代码,以便捕获异常?

Ela*_*zar 3

正如您所建议的,这是不可能的,并且也没有用于突然停止线程的 api,这排除了其他潜在的解决方案。

我相信你最好的解决方案是让看门狗设置一个标志,并让测试在某些点读取它。同样,您的测试可以简单地不时检查持续时间。

请注意,如果“标志”的设置方式会导致主线程引发异常(例如,从对象中删除属性),那么它也同样有效。

另一种可能性是使用多处理而不是多线程(如果您的应用程序可能的话)。