3

これが私の醜い小さなコードスニペットです:

for i in range(5):
        try:
            self.startTime=time.time()
            self.rawfeed=requests.get(self.feedurl)
            continue
        except ConnectionError:
            print "Got a connection error.  Retrying", i
            time.sleep(i*i) # giving a bit longer wait each time
            pass
if i == 5: raise
self.ResponseTime=time.time()-self.startTime

ここに2つの問題があります。まず、私のexceptステートメントは、「ConnectionError」を例外として認識していないようです(解決済み、ありがとう、スタッカー)が、グローバル変数ではないと文句を言います。そして第二に、そしてもっと重要なことは、エラーが私の側なのか、それともサーバー側なのかを本当に知りたいのです。

通常、MYエラーで再試行したいのですが、あきらめてSERVERエラーについて報告します。(「MY」エラーとは、サーバーエラー以外の意味です。)

4

2 に答える 2

3

requestsソースコードを見るとConnectionError、最大回数()を再試行した場合にのみ発生しMaxRetryErrorます。

except MaxRetryError, e:
    if not self.config.get('safe_mode', False):
        raise ConnectionError(e)

これがあなたの側またはサーバーによって引き起こされているかどうかを言うことはまったく不可能です。なぜなら、両方の側で非常に多くの問題がこれとまったく同じエラーを引き起こす可能性があるからです。たとえば、サーバーのHTTPデーモンが実行されていない場合、接続の試行はタイムアウトになります。ルーターでそれらをブロックした場合、またはルーターが他の理由で接続を切断した場合も、まったく同じことが起こります。

ただし、キャッチしていない例外HTTPErrorは、サーバーエラーである可能性がはるかに高くなります。ConnectionErrorある程度可能性がありますが、完全に保証されているわけではありません。

2番目の問題は、これらのクラスを適切にインポートしていないことです。以外をに変更するか、をexcept requests.ConnectionError実行しますfrom requests import ConnectionError, HTTPError

于 2013-01-09T13:48:48.797 に答える
2

ConnectionErrorPythonの他の名前と同様に、使用する前にインポートする必要があります。この場合、すでにインポートされているrequests名前空間を介して利用できるため、を実行できますexcept requests.ConnectionError:

あなたの主な質問に関しては、残念ながらこれは本当に意味がありません。あなたとサーバーの間にはインターネット全体があります。どの時点で、何かを「あなたの」エラーとして定義しますか?あなたのwifiアクセスポイント?あなたのルーター?あなたのモデム?あなたのISP?あなたと宛先の間のどこかにアップストリームプロキシがありますか?もちろん、のようなユーティリティを使用せずに、エラーが発生した場所を特定する方法はありませんtraceroute

于 2013-01-09T13:46:19.170 に答える