2009-06-01 24 views
7

Tôi cần vượt qua các ngoại lệ trên một ranh giới chuỗi.Làm cách nào để vượt qua ngoại lệ giữa các chủ đề trong python

Tôi đang sử dụng python được nhúng trong ứng dụng an toàn không phải là chủ đề có một cuộc gọi an toàn chủ đề, post_event (có thể gọi), có thể gọi từ chủ đề chính của nó.

Tôi đang chạy một gugtk gui trong một chủ đề riêng biệt, vì vậy khi một nút được nhấp, tôi đăng sự kiện với post_event và đợi cho đến khi kết thúc trước khi tiếp tục. Nhưng tôi cần người gọi để biết liệu callee có ném ngoại lệ hay không và tăng nó nếu có. Tôi không quá lo lắng về traceback, chỉ là ngoại lệ.

Mã của tôi là khoảng:

class Callback(): 
    def __init__(self,func,*args): 
     self.func=func 
     self.args=args 
     self.event=threading.Event() 
     self.result=None 
     self.exception=None 
    def __call__(self): 
     gtk.gdk.threads_enter() 
     try: 
      self.result=self.func(*self.args) 
     except: 
      #what do I do here? How do I store the exception? 
      pass 
     finally: 
      gtk.gdk.threads_leave() 
      self.event.set() 
    def post(self): 
     post_event(self) 
     gtk.gdk.threads_leave() 
     self.event.wait() 
     gtk.gdk.threads_enter() 
     if self.exception: 
      raise self.exception 
     return self.result 

Bất kỳ giúp đánh giá cao, cảm ơn.

Trả lời

12

# Tôi phải làm gì ở đây? Làm thế nào để lưu trữ ngoại lệ?

Sử dụng sys.exc_info()[:2], xem this wiki

Cách tốt nhất để liên lạc giữa các chủ đề là Queue. Có chủ đề chính khởi tạo một cá thể Queue.Queue và chuyển nó tới thư mục con; khi một subthread có gì đó để truyền lại cho master nó sử dụng .put trên hàng đợi đó (ví dụ như một tuple với id thread, loại ngoại lệ, giá trị ngoại lệ - hoặc, thông tin hữu ích khác, không nhất thiết phải ngoại lệ liên quan, chỉ cần đảm bảo mục đầu tiên của một tuple xác định loại thông tin ;-). Các bậc thầy có thể .get những đơn vị thông tin trở lại khi nó muốn, với sự lựa chọn khác nhau cho đồng bộ hóa và như vậy.

+0

Chính xác những gì tôi đã làm sau, cảm ơn. Thông thường tôi sẽ sử dụng hàng đợi, v.v .. nhưng tôi đang phát minh ra bánh xe bởi vì chỉ có một thứ sẽ chạy bất kỳ lúc nào trong kịch bản của tôi và tôi muốn nội dung chạy trên chuỗi của ứng dụng để hoàn thành và cung cấp cho tôi một kết quả trước khi tôi thực hiện thêm bất kỳ hành động nào trong chuỗi gtk. Tôi về cơ bản đang cố gắng để giả luồng đơn với hai chủ đề. Nó gây phiền nhiễu nhưng dường như nó hoạt động tốt. – DaedalusFall

Các vấn đề liên quan