twistedのエラーハンドリング
twistedっていうかDeferred のエラーハンドリングのお話。
つーか真面目に読めばすぐわかることじゃねーか!
twistedのエラーはtwisted.internet.error.Failureで渡ってきます。
実際に発生したエラーを取得する際には
def getContentErr(self, failure): print failure.raiseException()
のようにraiseExceptionメソッドを呼び出す事で取得できます。
ただこれだとめんどくさい。のですがFailureクラスにはなかなか面白いメソッドが存在します。
trapとcheckです。
trap
def getContentErr(self, failure): from twisted.internet.error import TCPTimedOutError,TimeoutError r = failure.trap(TCPTimedOutError,TimeoutError): if r == TCPTimedOutError: print "TCPTimedOutError" elif r == TimeoutError: print "TimeoutError" else: pass
trapメソッドはその名の通り引き数で指定したExceptionを捕らえます。
trapメソッドはマッチした例外を結果として返します。
マッチしなかった場合にはそのまま次のErrbackへ例外を伝播します。
そのため、処理を続行させたい条件や、指定の例外発生時にreactorをstopさせる場合などに使います。
またtrapは引き数をなしで呼び出すと実際に起きたエラーを再発生させることができます。
(従来のtry文を書けるということ)
trapと似たようなものにcheckメソッドがあります。
check
def getContentErr(self, failure): from twisted.internet.error import TCPTimedOutError,TimeoutError if not failure.check(TCPTimedOutError,TimeoutError): print failure return failure
checkもtrapと同様に例外がマッチするか調べます。
上記だとタイムアウト例外以外は致命的なものとして次のErrbackにErrを返しています。
こちらは勝手に次のErrbackを呼び出しません。
っていうのをさっき知った!><
うくく。