从定时器中捕获异常
Catching exception from timer
我正在尝试创建一个看门狗 class,它将在指定时间后抛出异常:
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"
这个异常没有被捕获,因为异常是从完全不同的上下文中抛出的,因此我们将看到最后一条消息。
我的问题是,如何修改代码,才能捕获异常?
正如您所建议的那样,这是不可能的,而且 there is no api for abruptly stopping a thread 也排除了其他可能的解决方案。
我相信你最好的解决办法是让看门狗设置一个标志,让测试在某些时候读取它。同样,您的测试可以不时地检查持续时间。
请注意,如果 "flag" 的设置方式会导致主线程引发异常(例如,从对象中删除属性),它将同样有效。
如果您的应用程序可行,另一种可能性是使用多处理而不是多线程。
我正在尝试创建一个看门狗 class,它将在指定时间后抛出异常:
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"
这个异常没有被捕获,因为异常是从完全不同的上下文中抛出的,因此我们将看到最后一条消息。
我的问题是,如何修改代码,才能捕获异常?
正如您所建议的那样,这是不可能的,而且 there is no api for abruptly stopping a thread 也排除了其他可能的解决方案。
我相信你最好的解决办法是让看门狗设置一个标志,让测试在某些时候读取它。同样,您的测试可以不时地检查持续时间。
请注意,如果 "flag" 的设置方式会导致主线程引发异常(例如,从对象中删除属性),它将同样有效。
如果您的应用程序可行,另一种可能性是使用多处理而不是多线程。