2010-08-10 46 views
3

什麼時候應該使用twisted.python.failure.Failure,何時應該使用類似twisted.internet.error.ConnectionDone的東西?或者我應該做twisted.python.failure.Failure(twisted.internet.error.ConnectionDone),如果是的話,我應該怎麼做?twisted:Failure vs. Error

回答

8

A Failure表示異常和回溯(通常不同於當前堆棧跟蹤)。當你構造一個異步異常時,你應該使用Failure。所以,當你打算髮出一個錯誤Deferred,或者當你打電話給IProtocol.connectionLostClientFactory.clientConnectionFailed這樣的方法。這是因爲在這種情況下,您希望能夠將不同的堆棧跟蹤與異常相比,而不是當前的堆棧跟蹤。

您不應該使用Failure(ConnectionDone),因爲Failure的正確的單參數調用接受異常實例,而不是異常類。所以,改爲使用Failure(ConnectionDone())。您也可以使用零參數表單創建新的FailureFailure()。這隻適用於存在「當前」異常的情況,例如在except聲明的套件中。它使用當前的異常以及其回溯構建Failure

你也可以用三個參數構造一個Failure,它是一個異常類,實例和回溯。這通常是使用返回值sys.exc_info()完成的。

當你只是想引發一個異常時,你不需要創建一個Failure。只要做一些你通常在Python程序中發起的異常:raise SomeException(...)