【问题标题】:ftplib, how to manage exception without errno attribute?ftplib,如何在没有 errno 属性的情况下管理异常?
【发布时间】:2012-12-18 10:34:50
【问题描述】:

如果文件不存在,我想在 ftp 站点上上传文件。这是一个更复杂的应用程序的任务,但在这种情况下并不重要。 我的想法是使用FTP.size(filename)方法检查文件是否存在,如果错误是550(系统找不到指定的文件)上传文件。

我的(不工作的)代码:

from ftplib import *
ftp = FTP("ftp.test.com", "user", "password")
try:
    ftp.size("123.zip")
except ftplib.all_errors, e:
    if e.errno == 550:
        print "UPLOAD"
    else:
        print str(e)

返回的错误是

Traceback (most recent call last):
  File "<pyshell#106>", line 4, in <module>
    if e.errno == 550:
AttributeError: 'error_perm' object has no attribute 'errno'

或者如果发生临时错误:

AttributeError: 'error_temp' object has no attribute 'errno'

我发现管理返回码的唯一解决方案是:

except ftplib.all_errors, e:
if str(e.args[0]).split(" ", 1)[0] == "550":
        print "UPLOAD"
    else:
        print str(e)

但我认为有一个最佳解决方案,因为只有当错误号是异常消息中的第一个单词时才有效。

提前谢谢你!

【问题讨论】:

  • 这段代码在我的电脑上运行良好。你确定你使用的是正确版本的 Python 吗?我正在运行 2.7。

标签: python exception python-2.7 ftplib


【解决方案1】:

我不确切知道该错误的属性,因此您可以做的是在 except 子句激活时打印 dir(e)。然后您将看到错误的所有属性。一个几乎从不作为标志失败的是“error.message”,它是一个字符串,因此您可以使用它构建 if 子句。

你会以类似的方式结束

try:
    ftp.size("123.zip")
except ftplib.all_errors as e:
    if e.message == 'message of the error'
        print 'UPLOAD'
    else:
        print str(e)

顺便说一句,消息是执行 str(e) 时得到的一件事。

【讨论】:

    【解决方案2】:

    也许这有帮助,它来自 ftplib 的文档。

    请注意,SIZE 命令不是标准化的,但许多常见的服务器实现都支持。

    链接here

    尝试使用其他方法来确定文件是否存在。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2021-12-27
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多