2

webclient.Agent を使用して http ダウンローダーを作成しました。

body コンシューマ オブジェクトの connectionLost 関数が reason パラメータで呼び出されます。

def connectionLost(self, reason):
    if isinstance(reason.value, ResponseDone):
        self.df.callback(None)
    else:
        self.df.errback(reason.value)

「理由」で可能な例外クラスを知りたいのですが、それらをすべてキャッチし、後で inlineCallbacks を使用する呼び出し関数で処理する必要があるためです。これまでのところ、次のことを特定しました。

ConnectError, BindError, ConnectionClosed, ResponseFailed

これはどこかに文書化されていますか?ドキュメントのほとんどには、あいまいな「...エラーの説明を含むエラーバック...」ステートメントが含まれています。

4

1 に答える 1

2

それらすべてを具体的に捉える必要はありません。例外処理は継承を尊重します。基本クラスをキャッチしようとしてサブクラスが発生すると、それもキャッチされます。 ExceptionはPythonのほぼすべての例外の基本クラスであるため、それをキャッチすると、ほぼすべてをキャッチできます。

try:
    yield agent.request(...)
except Exception as e:
    print 'Oh no, some failure'
else:
    print 'Success'

すべての例外の完全なリストはありませんAgent.requestこのリストを事前に知ることは不可能であるため、失敗する可能性があります。失敗は接続設定が原因である可能性がありますが、それはプレーンTCP接続ですか、それともHTTPS URLのSSL接続ですか?おそらく、ユーザーのネットワーク構成が不幸なため、SOCKSプロキシを介した接続です。これらはすべて、さまざまな方法で失敗する可能性があります。同じことが実際のHTTPリクエスト自体にも当てはまります-サーバーがどのように動作するか誰が知っていますか?おそらく、予期しないエラーコードで応答するか、エージェントが解析できず、低レベルのHTTPクライアントプロトコル実装からの例外をトリガーできないもので応答する可能性があります。パーサーは手作りであるため、この種の問題から発生する可能性のあるさまざまな例外がおそらくあります。そして、コンテンツと転送エンコーディングにはバリエーションがあります。

したがって、使用するすべての場所でこれらすべての例外の完全なリストを考え出すのではなく、Agent.request知っている例外タイプのみを具体的に処理し、特別なコードを用意してから、他のすべてを。で処理しますexcept Exception

于 2012-11-14T17:28:45.767 に答える