5

サーバーに接続していくつかのコマンドを送信するPythonプログラムがありますが、時々このエラーが発生します

TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

このような以前の状況では、このようなものを使用します

try:
            do something
        except KeyError:
            do something else

この同じ状況で同じことをすることができますか?

try:
                do something
            except TimeoutError:
               do something again

もしそうなら、Exception TimeoutError 以外の後に私は何をしますか? 同じコマンドをもう一度実行しますか?

4

4 に答える 4

23

この同じ状況で同じことをすることができますか

はい!try/exceptあらゆる例外に使用でき、TimeoutError特別なことではありません。

もしそうなら、Exception TimeoutError 以外の後に私は何をしますか? 同じコマンドをもう一度実行しますか?

1 回だけ再試行し、2 回目のタイムアウトを実際のエラーとしてカウントする場合は、はい:

try:
    do something
except TimeoutError:
    do something

(「何かをする」が単純なステートメント以上のものである場合は、コードを除外して、同じことを繰り返さないようにすることをお勧めします。)

ただし、複数回再試行する場合は、おそらくループが必要です。

for _ in range(max_retries):
    try:
        do something
        break
    except TimeoutError:
        pass

2 つのケース (成功した、および実行した、vs. 成功せず、試行回数を使い果たした)を区別するために、 にelse句を追加することができます。forbreak


ここでの考え方は通常、一時的なエラーに対処することであるため、次のようなものを追加する必要がある場合があります。

  • の後にエラーを再発生させるか、別のエラーを発生させますmax_retries
  • 段階的に高いレベルでログを記録します (たとえば、単一の失敗に対するデバッグ メッセージですが、`max_retries に対する警告)。
  • 指数バックオフで再試行しています (1 秒待ってから 2、4、8、…)。
  • すぐに再試行するのではなく、作業キューの最後に URL をプッシュします。ロジック(URL, retry_count)も必要な場合はペア、指数バックオフも必要な場合はペア、両方が必要な場合は両方を使用できます。(もちろん、これは応答の順序を気にしない場合、または最後に順序を変更できる場合にのみ機能します。)max_retries(URL, timestamp)
  • 異なる例外に対する異なるルール (例: 500、502、503、および 504 エラーはすべて、サーバーまたはプロキシの過負荷が原因である可能性がありますが、最適な再試行ロジックは異なる可能性があります。また、2018 年の最適なヒューリスティックは、2010 年または2025年)。

複雑な組み合わせの場合、jterrace の役立つ回答にリンクされているような再試行デコレータは、動作をまとめる優れた方法です。

于 2013-09-17T01:49:59.800 に答える
6

あなたが言及したように、TimeoutErrorをキャッチすることができます:

import socket
import sys
try:
  dosomething()
except socket.TimeoutError:
  print >> sys.stderr, 'Retrying after TimeoutError'
  dosomething()

関数でretry デコレータ パターンを使用することもできます。

@retry(socket.TimeoutError)
def dosomething():
    # code that causes a TimeoutError
    ...
于 2013-09-17T01:48:28.040 に答える
2
def f():
    pass #insert code here

エラーの後にもう一度繰り返すには:

try:
    f()
except TimeoutError:
    f()

または、成功するまでループするには:

while True:
    try:
        f()
        break
    except TimeoutError:
        pass

または限られた数で:

attempts = 3
while attempts:
    try:
        f()
        break
    except TimeoutError:
        attempts -= 1
于 2013-09-17T01:48:55.883 に答える
-1

各例を実行してください。準備ができています。

例 1

import sys

try:
    incorrect.syntaxThatIJustMadeUP()
except:
    print((sys.exc_info()[0])) #Now you know what to except and CATCH
else:
    print("You will never see this message")

例 2

import sys

try:
    incorrect.syntaxThatIJustMadeUP()
except NameError:
    print("There is a problem with your SYNTAX Dude!")
except:
    print((sys.exc_info()[0])) #Incase another uncontrollable network problem occurs, User rages-Snaps IJ45
else:
    print("You will never see this message unless TRY suceeds")
    print("Why not put this try in a loop")
于 2014-11-23T02:44:42.753 に答える