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:这些是由套接字连接引发的,很可能是您感兴趣的。

异常 ftplib.error_reply:从服务器收到意外回复时引发异常。

异常 ftplib.error_temp:收到表示临时错误的错误代码(400-499 范围内的响应代码)时引发异常。

异常 ftplib.error_perm:当收到表示永久错误的错误代码(500-599 范围内的响应代码)时引发异常。

异常 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 回答