Python使用ftplib传文件时try except的except分支不运行如何解决?
问题根因
- 你最初的代码错误地把可能抛出异常的
FTP连接初始化、本地文件打开操作放在了try块之外,这两行代码触发的异常完全不会被except捕获,所以会直接抛出到终端。 - 调整后的代码仍然把
open(...)操作放在try块外,所以本地文件不存在的异常无法捕获;另外ftplib.all_errors仅覆盖ftplib库自身抛出的异常,本地文件IO相关的异常属于Python内置异常,不在该捕获范围内。
修正方案
把所有可能抛出异常的操作都纳入try块覆盖范围,按异常类型分类捕获逻辑更清晰:
import ftplib try: # 本地文件打开、FTP连接、上传操作全部放在try块内 file = open("path/test.txt", "rb") session = ftplib.FTP("192.168.0.164", "admin", "admin") session.storbinary("STOR application/test.txt", file) except ftplib.all_errors: print("FTP操作失败(主机不可达、认证失败、上传错误等)") except FileNotFoundError: print("本地文件不存在,请检查路径") except Exception as e: print(f"其他未知错误:{e}") else: print("success!") session.quit() finally: print("DONE!!") # 注意判断file是否成功初始化,避免open失败时close报错 if 'file' in locals() and not file.closed: file.close()
补充说明
- 不要用无差别的裸
except,会捕获到比如KeyboardInterrupt(用户手动终止程序)这类你不需要处理的异常,分类捕获更可控。 - 最终关闭文件前要先判断文件对象是否存在、是否已经关闭,避免文件打开失败时执行
file.close()抛出新的异常。
内容的提问来源于stack exchange,提问作者nearbyatom
相关产品推荐
相关产品推荐

