【问题标题】:Ignore exceptions in python with FTP使用 FTP 忽略 python 中的异常
【发布时间】:2019-12-20 22:03:16
【问题描述】:

我正在尝试编写一个快速的小程序,它将通过 CSV 文件解析提取用户名和密码并测试登录到 FTP 以创建一个目录并使用这些用户名和密码将其删除。我写了一个 try catch,所以它可以输出我得到的任何错误,以便我可以查看哪些 FTP 登录可能需要调整。问题是当我运行它时,如果任何登录被破坏而不是继续,它将停止。我尝试过使用passfinally,但它不会返回循环。任何帮助表示赞赏。

import csv
import ftplib
from ftplib import FTP
with open ('Filename.csv') as csvfile:  
    readCSV = csv.reader(csvfile, delimiter=',')
    lineCount = 0
    rowCount = 0
    for row in readCSV:
        username = row[rowCount]
        passwordFTP = row[rowCount+1]
        print (username)
        ftp = FTP('ftp.org') #place the FTP address here 
        ftp.set_debuglevel(2) #this is set to highest debug level 
        try: 
            ftp.login(user='usernameGoesHere', passwd='passwordGoesHere', acct='')
        except ftplib.all_errors as e:
            errorcode_string = str(e).split(None, 1)[0]
            pass
        finally: 
            ftp.cwd('/TestDir')
            ftp.mkd('testDir')
            ftp.rmd('testDir')
            ftp.quit()
            pass

【问题讨论】:

  • 向我们展示一些证据 - 来自 ftplib 的日志文件 + 向您的代码添加一些调试输出并向我们展示您得到的结果。

标签: python loops error-handling ftp


【解决方案1】:

将代码放在finally 中实际上是没有品脱的。尽管您已经放置了 pass 语句,但它在此代码中没有任何作用。在登录时出现错误时,程序将记录错误并仍然尝试为给定的连接创建一个文件夹。

而是将cwdmkd 和其他方法移到try 块中。如果那里抛出错误,except 将捕获它并停止执行。

绝对没有必要将pass 语句放在try 的任何位置。唯一可以保留在finally 块中的是ftp.quit(),因此它会清理,如果其中一个操作失败则关闭连接,但另一方面,如果登录不成功会发生什么?

执行以下操作:

with FTP('ftp.org') as ftp
    try: 
        ftp.login(user='usernameGoesHere', passwd='passwordGoesHere', acct='')
        ftp.cwd('/TestDir')
        ftp.mkd('testDir')
        ftp.rmd('testDir')
    except ftplib.all_errors as e:
        errorcode_string = str(e).split(None, 1)[0]

使用上下文管理器(with 语句)将帮助您手动退出。

【讨论】:

  • 这解决了,应该很明显,如果登录失败,它将无法尝试其他任何事情。谢谢!
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多