2014-01-21 63 views
0

我在下面的類中使用with語句。使用語句析構函數來捕獲初始異常

def __init__(self): 
    ... 

def __enter__(self): 
    return self 

def __exit__(self, type, value, traceback): 
    print "EXIT Shutting the SDK down" 
    ret = self.sdkobject.ShutDown() 
    self.error_check(ret) 

這會捕獲我在使用該類的對象時發生的任何錯誤,並安全地關閉我正在使用的SDK。但是,當類仍在初始化時,它會遇到問題。我最近找到了整潔解決這個問題的「del」函數。但是,它不能與exit函數一起使用(因爲with語句喚起退出並且del得到異常)。如何使用statemtent設置析構函數,即使在初始化過程中也會捕獲失敗?

+0

你的意思是'__init__'中的異常也需要觸發關閉? –

+0

@Martijn Pieters是 – Marmstrong

回答

1

創建一個單獨的shutdown函數,該函數在__init__try/except塊中以及任何需要正確關閉的地方調用。

+0

是否在__init__類中嘗試except語句? – Marmstrong

+0

@ Marmstrong:是的。他們爲什麼不呢? – user2357112

+0

是啊灑在需要的地方。 – jramirez

0

趕上__init__的異常並處理它。 __del__是不必要的。

2

例外在__init__需要在直接處理該方法:

class YourContextManager(object): 
    sdkobject = None 

    def __init__(self): 
     try: 
      self._create_sdk_object() 
     except Exception: 
      if self.sdkobject is not None: 
       self.sdkobject.ShutDown() 
      raise 

    def _create_sdk_object(self): 
     self.sdkobject = SomeSDKObject() 
     self.sdkobject.do_something_that_could_raise_an_exception() 

    def __enter__(self): 
     return self 

    def __exit__(self, type, value, traceback): 
     print "EXIT Shutting the SDK down" 
     ret = self.sdkobject.ShutDown() 
     self.error_check(ret) 

注意,異常被重新提高;您希望爲上下文管理器的使用者提供處理創建上下文管理器失敗的機會。