Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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を呼び出しません。



っていうのをさっき知った!><
うくく。