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
相关产品推荐
相关产品推荐

