快速结论:这个报错发生在 Dify 使用 AWS S3 或 Oracle OCI 作为存储后端时,exists() 方法中的裸 except: 会吞掉 KeyboardInterrupt/SystemExit,导致进程无法正常退出。优先排查存储后端代码中是否存在过宽的异常捕获。
适用环境:Dify(main 分支,commit f5e1f1590f),存储后端为 AWS S3 或 Oracle OCI(通过 S3 兼容端点)。涉及文件:api/extensions/storage/aws_s3_storage.py 和 api/extensions/storage/oracle_oci_storage.py。
最快修复方案:暂无确认的一步修复方案。Issue 中提出的修复建议(将裸 except: 收窄为 botocore.exceptions.ClientError)已提交 PR #38089,但尚未合并到 main 分支。
注意事项:该修复方案来自 Issue 讨论中的建议,尚未经过官方合并验证。如果你在使用中遇到此问题,可优先尝试本地应用该修复;但需注意直接修改源码可能在后续升级时被覆盖。
问题场景
当 Dify 配置 AWS S3 或 Oracle OCI 作为文件存储后端时,用户在调用 exists() 方法(例如上传或访问文件时)按下 Ctrl+C 或遇到工作进程关闭,进程无法正常退出,操作被静默吞掉并被报告为“文件不存在”。
报错原文
bare except in storage exists() swallows KeyboardInterrupt/SystemExit
def exists(self, filename):
try:
self.client.head_object(Bucket=self.bucket_name, Key=filename)
return True
except: # catches KeyboardInterrupt / SystemExit too
return False
原因分析
可能原因:exists() 方法使用了裸 except:,这会捕获所有异常,包括 KeyboardInterrupt(用户按 Ctrl+C)和 SystemExit(系统退出信号)。在调用 head_object 期间发生中断时,异常被静默吞掉,操作被错误地报告为“文件不存在”,进程无法正常退出。该问题在两个存储后端(AWS S3 和 Oracle OCI)中均存在。
环境排查
- 确认 Dify 版本是否为 main 分支(commit f5e1f1590f)或更早版本。
- 确认存储后端配置为 AWS S3 或 Oracle OCI。
- 检查
api/extensions/storage/aws_s3_storage.py第 89 行附近和api/extensions/storage/oracle_oci_storage.py第 61 行附近是否存在裸except:。 - 确认
botocore库是否已正确安装并可导入。
解决步骤
- 定位问题代码:打开两个文件,找到
exists()方法中的裸except:。 - 应用修复(可优先尝试):将裸
except:收窄为except botocore.exceptions.ClientError:,并将return False移到该 except 块内。
可优先尝试的修复示例:def exists(self, filename): try: self.client.head_object(Bucket=self.bucket_name, Key=filename) return True except botocore.exceptions.ClientError: return False - 确认兼容性:两个文件均已导入
botocore.exceptions,确认导入未受影响。 - 验证流程:重启 Dify 服务,进行文件上传/访问操作,测试中断行为。
验证方法
修复后,在调用 exists() 期间按下 Ctrl+C,进程应能够正常响应中断并退出,而不是将操作静默报告为“文件不存在”。可同时检查日志中是否出现 KeyboardInterrupt 或 SystemExit 异常信息。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


