You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python SFTP异常处理:如何区分socket.error与PermissionError?

问题原因
  • Python 3.3及以上版本中,socket.error已被整合为OSError的别名,你遇到的「Socket is closed」报错最终抛出的异常类型为OSError;而文件操作无权限触发的PermissionError同样属于OSError的子类。
  • 出现误捕获的核心原因是异常捕获逻辑不规范:要么是未按「子类在前、父类在后」的顺序编写异常捕获分支,把范围更大的OSError分支当成权限错误处理;要么是没有基于异常类型做判断,仅通过异常字符串模糊匹配区分错误类型,匹配规则存在漏洞导致连接断开的报错被误归类到权限异常分支。
正确捕获方案

按异常类型优先级分层捕获,同时结合异常信息做二次校验,避免误判:

import paramiko
import socket

try:
    # 你的SFTP操作逻辑 示例:sftp.put(local_path, remote_path)
except PermissionError:
    # 权限异常专属处理逻辑
    print("远程路径访问权限不足,请确认SFTP账号权限配置")
except (socket.error, OSError, paramiko.ssh_exception.SSHException) as e:
    err_msg = str(e)
    if "Socket is closed" in err_msg or "Connection reset" in err_msg or "Broken pipe" in err_msg:
        # 连接断开异常专属处理逻辑,可在此处添加重连重试逻辑
        print("SFTP连接已中断,可触发重连流程")
    else:
        # 其他系统异常处理逻辑
        print(f"操作异常:{err_msg}")
补充说明

如果需要更精细的区分SFTP服务端返回的权限错误,还可以额外捕获paramiko.sftp_client.SFTPError,通过错误码判断是否为权限类错误(SFTP协议错误码3对应权限不足)。

内容的提问来源于stack exchange,提问作者Mahmoud Abdulkarim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:24:04