11

FTP接続があり、そこから多くのファイルをダウンロードして処理しています。FTP接続が間にタイムアウトしていないことを確認できるようにしたいと思います。したがって、コードは次のようになります。

conn = FTP(host='blah')
conn.connect()
for item in list_of_items:
    myfile = open('filename', 'w')
    conn.retrbinary('stuff", myfile)
    ### do some parsing ###

回線中にタイムアウトした場合にFTP接続を確認するにはどうすればよい### do some parsing ###ですか?

4

1 に答える 1

23

NOOP コマンドを送信します。これは、接続がまだ進行していることを確認するだけであり、定期的に行うと、接続を維持できます。

例えば:

   conn.voidcmd("NOOP")

接続に問題がある場合、FTP オブジェクトは例外をスローします。ドキュメントから、エラーが発生した場合に例外がスローされることがわかります。

socket.error および IOError:これらはソケット接続によって発生し、関心のあるものである可能性が最も高いです。

exception ftplib.error_reply:サーバーから予期しない応答を受信したときに発生する例外。

exception ftplib.error_temp:一時的なエラーを示すエラー コード (400 ~ 499 の範囲の応答コード) を受信したときに発生する例外。

exception ftplib.error_perm:永続的なエラーを示すエラー コード (500 ~ 599 の範囲の応答コード) を受信したときに発生する例外。

exception ftplib.error_proto:ファイル転送プロトコルの応答仕様に適合しない、つまり 1 ~ 5 の範囲の数字で始まる応答をサーバーから受信した場合に発生する例外。

したがって、try-catch ブロックを使用してエラーを検出し、それに応じて処理できます。

たとえば、次のコード サンプルは IOError をキャッチし、それについて通知してから、操作を再試行します。

retry = True
while (retry):
    try:
        conn = FTP('blah')
        conn.connect()
        for item in list_of_items:
            myfile = open('filename', 'w')
            conn.retrbinary('stuff', myfile)   
            ### do some parsing ###

        retry = False

    except IOError as e:
        print "I/O error({0}): {1}".format(e.errno, e.strerror)
        print "Retrying..."
        retry = True
于 2013-03-02T04:03:14.693 に答える