异常处理尚未接入全局拦截器,需在main.py或app.py中注册如@app.exception_handler(requestvalidationerror)等处理器,否则异常直接返回500,无法测试业务级错误响应。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

确认异常处理是否已接入全局拦截器
打开项目根目录下的 main.py 或 app.py,查找是否注册了全局异常处理器,例如 FastAPI 中的 @app.exception_handler(RequestValidationError) 或 Flask 中的 @app.errorhandler(400)。没有这层拦截,所有异常都会直接透出为 500,根本测不到业务级错误响应。
用 grep -r "exception_handler\|errorhandler" . --include="*.py" 快速扫描,若无任何匹配结果,说明异常处理尚未接入——后续所有测试都无效,必须先补上这步。
构造非法请求触发预设异常分支
方法一:参数类型强转失败测试
向 /api/orders 发送 POST 请求,body 中传 {"amount": "abc"}(字符串而非数字)。后端若启用了 Pydantic 校验,应返回 422 + 字段错误详情;若返回 500 或空响应,证明 【RequestValidationError 未被正确捕获】。
方法二:路径参数越界测试
调用 GET /api/users/{user_id} 时,把 {user_id} 替换为 -1 或 999999999999999999999。若接口定义中该参数有 Ge(1) 约束但响应仍是 200 或 500,说明约束未生效或异常处理器未覆盖该路径。
通过本地 Codex 或 OpenClaw OAuth 凭证直接调用 ChatGPT/Codex Responses 的 image_generation 工具来生成或编辑光栅图像,然后保存
方法三:手动抛出业务异常测试
临时在目标函数开头插入 raise ValueError("mock_business_error"),再发起合法请求。观察响应状态码和 body 内容:若返回 500 且无自定义 message,代表 【业务异常未被 exception_handler 捕获】;若返回 400 且 body 含 "mock_business_error",说明生效。
验证错误响应结构是否符合契约
第一步:确认 OpenAPI 文档中已声明错误响应
检查 openapi.yaml 的对应接口 responses 节点,是否存在 400、422、500 等状态码定义,且 content.application/json.schema 明确包含 code、message、details 字段。缺少声明会导致 Codex 无法校验响应结构。
第二步:用 Codex CLI 执行契约校验
在含 openapi.yaml 的目录运行:codex test contract GET /api/orders?limit=abc。Codex 将自动发送非法请求并比对响应字段。若提示 missing field 'code' 或 field 'message' type mismatch,说明实际返回与契约不一致,需修正异常处理器的返回模板。
第三步:检查错误堆栈是否脱敏
故意触发一个未被捕获的异常(如除零),确认响应 body 中不含 File "/app/main.py", line 42, in create_order 类似 traceback。若出现完整路径和行号,证明生产环境未关闭 debug 模式,【存在敏感信息泄露风险】,需在启动参数中添加 --debug=False 或设置环境变量 DEBUG=false。










