Vấn đề là thread_obj.start () trả về ngay lập tức. Luồng con mà bạn đã bắt đầu thực thi trong ngữ cảnh riêng của nó, trong ngăn xếp của chính nó. Bất kỳ ngoại lệ nào xảy ra ở đó đều nằm trong ngữ cảnh của chuỗi con. Bạn phải truyền thông tin này tới chuỗi chính bằng cách chuyển một số thông báo.
Đoạn mã có thể được viết lại như sau:
import sys import threading import Queue class ExcThread(threading.Thread): def __init__(self, foo): threading.Thread.__init__(self) self.foo = foo def run(self): try: raise Exception('An error occurred here.') except Exception: self.foo.put(sys.exc_info()) def main(): foo = Queue.Queue() thread_obj = ExcThread(foo) thread_obj.start() while True: try: exc = foo.get(block=False) except Queue.Empty: pass else: exc_type, exc_obj, exc_trace = exc print exc_type, exc_obj print exc_trace thread_obj.join(0.1) if thread_obj.isAlive(): continue