如何从线程中捕获异常

时间:2016-02-16 15:57:59

标签: python multithreading exception

我有这段代码启动了一个帖子。然后等待几秒钟,然后检查是否有事件。如果它确实有事件,则该线程被取消'。否则抛出异常。

我想知道如何捕捉这个例外,因为我已经搜索了很长时间并且找不到明确的答案。

signal

首先我用Python signal.alarm尝试了这个概念,但是当执行超过1 time.sleep(11)时,它就完全陷入了困境(可能是一个错误)。

修改
我不想扩展现有的类,我想使用本机定义的类。

此外,我不想连续循环检查是否发生异常。我希望线程将异常传递给其父方法。因此,我的代码中的{{1}}操作

1 个答案:

答案 0 :(得分:3)

根据我对你问题的评论而创建 尝试这样的事情。

import sys
import threading
import time
import Queue


def thread(args1, stop_event, queue_obj):
    print "starting thread"
    stop_event.wait(10)
    if not stop_event.is_set():
        try:
            raise Exception("signal!")
        except Exception:
            queue_obj.put(sys.exc_info())
    pass


try:
    queue_obj = Queue.Queue()
    t_stop = threading.Event()
    t = threading.Thread(target=thread, args=(1, t_stop, queue_obj))
    t.start()

    time.sleep(11)

    # normally this should not be executed
    print "stopping thread!"
    t_stop.set()

    try:
        exc = queue_obj.get(block=False)
    except Queue.Empty:
        pass
    else:
        exc_type, exc_obj, exc_trace = exc
        print exc_obj

except Exception as e:
    print "action took to long, bye!"

运行时,会引发异常"signal!",并由print exc_obj打印。