2013-03-02 45 views
7

Tôi có kết nối FTP mà từ đó tôi đang tải xuống nhiều tệp và xử lý chúng ở giữa. Tôi muốn có thể kiểm tra xem kết nối FTP của tôi đã hết thời gian chờ chưa. Vì vậy, các mã trông giống như sau:Kiểm tra kết nối FTP bằng Python

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

Làm thế nào tôi có thể kiểm tra kết nối FTP của tôi trong trường hợp nó timed out trong dòng ### do some parsing ###?

Trả lời

17

Gửi một lệnh NOOP. Điều này không có gì, nhưng kiểm tra xem kết nối vẫn đang đi và nếu bạn làm nó định kỳ nó có thể giữ cho kết nối còn sống.

Ví dụ:

conn.voidcmd("NOOP") 

Nếu có một vấn đề với các kết nối sau đó các đối tượng FTP sẽ ném một ngoại lệ. Bạn có thể nhìn thấy từ documentation rằng trường hợp ngoại lệ được ném nếu có một lỗi:

socket.error và IOError:. Đây là những nuôi dưỡng bởi các kết nối ổ cắm và có nhiều khả năng những người bạn quan tâm đến

ngoại lệ ftplib.error_reply: Ngoại lệ được nêu khi nhận được thư trả lời không mong muốn từ máy chủ.

ngoại lệ ftplib.error_temp: Ngoại lệ được nâng lên khi mã lỗi biểu thị lỗi tạm thời (mã phản hồi trong khoảng 400-499) được nhận.

ngoại lệ ftplib.error_perm: Ngoại lệ được nâng lên khi mã lỗi biểu thị lỗi vĩnh viễn (mã phản hồi trong phạm vi 500–599) được nhận.

ngoại lệ ftplib.error_proto: Ngoại lệ được nêu khi nhận được trả lời từ máy chủ không khớp với thông số phản hồi của Giao thức truyền tệp, tức là bắt đầu bằng một chữ số trong khoảng từ 1–5.

Vì vậy, bạn có thể sử dụng một try-catch block để phát hiện lỗi và xử lý nó cho phù hợp.

Ví dụ mẫu mã này sẽ bắt một IOError, cho bạn biết về nó và sau đó thử lại thao tác:

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 
+0

'ftplib' dường như không phù hợp với nguyên tắc Pythonic rằng cần có một cách rõ ràng để làm một cái gì đó - hoặc ít nhất bạn sẽ phải cho tôi rằng trên 'voidcmd ('NOOP')' – Axeman

Các vấn đề liên quan