必须在e := echo.New()后立即注册HTTPErrorHandler,否则路由已定义的错误将绕过自定义逻辑;它仅处理echo.NewHTTPError或recover捕获后转成的*echo.HTTPError,需配合middleware.Recover()并确保中间件顺序正确。

注册 HTTPErrorHandler 必须在路由定义前
全局错误处理机制的入口是 e.HTTPErrorHandler,它只对通过 echo.NewHTTPError 或 panic(配合 middleware.Recover())触发的错误生效。如果在 e.GET() 等路由注册之后才设置该字段,已有路由的错误将完全绕过你的自定义逻辑,继续走默认纯文本响应。
常见错误现象:c.JSON(400, map[string]string{"error": "bad request"}) 依然能跑通,但日志不记录、traceID 不注入、错误格式不统一——因为这根本没进错误处理链。
- 必须在
e := echo.New()后立即赋值,例如:e.HTTPErrorHandler = customErrorHandler - 不要把它放在中间件里或某个 handler 中动态改;它是一个启动期配置
- 若用了
middleware.Recover(),recover 捕获到的 panic 会转成echo.NewHTTPError(500, ...)再交由该函数处理,所以也要确保 recover 中间件已注册(且顺序在 error handler 生效范围内)
customErrorHandler 函数里怎么返回 JSON 错误响应
默认的 HTTPErrorHandler 只写状态码和 err.Error() 字符串,生产环境必须重写。核心是:用 c.JSON() 替代 c.String(),并控制字段名、脱敏逻辑和状态码映射。
典型定制点:
- 区分错误类型:
err.(*echo.HTTPError)可取真实Code和Message;非 HTTPError(如数据库连接失败)应统一 fallback 到 500 并隐藏细节 - 避免敏感信息泄露:
err.Error()可能含 SQL 语句或路径,建议只取he.Message或硬编码提示,如"Something went wrong" - 加 traceID:从
c.Request().Context()提取或生成,并写入响应头c.Response().Header().Set("X-Trace-ID", tid) - 结构体示例:
c.JSON(code, map[string]string{"error": "invalid_id", "message": "ID must be numeric"})
为什么不能在 handler 里直接 return c.JSON(400, ...)
这种写法看起来快,实则破坏整个错误流控体系。它跳过了 HTTPErrorHandler,导致中间件层(如日志、监控、熔断)收不到错误事件,也无法做统一格式封装或上下文增强。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
正确做法是让错误“冒泡”:
- 校验失败时用
return echo.NewHTTPError(400, "invalid id") - 业务异常(如用户不存在)用
return echo.NewHTTPError(404, "user not found") - 底层错误(如 DB timeout)包装后抛出:
return echo.NewHTTPError(500, "database unavailable") - 绝对不要在 handler 里调用
c.String()、c.NoContent()处理错误;它们不触发HTTPErrorHandler
中间件中抛错怎么接入全局处理
中间件(如 JWT 验证、权限检查)出错时,同样要走 echo.NewHTTPError,否则错误不会被统一捕获。
错误示范:c.String(401, "unauthorized") → 绕过所有错误处理逻辑
正确写法:
- 在中间件函数内:
return echo.NewHTTPError(401, "token expired") - 注意:中间件返回 error 才会被框架识别为中断请求;仅
c.String()不算 - 如果中间件需提前终止流程但不报错(如 redirect),可用
return nil+c.Redirect(),这不属于错误流 - 自定义错误类型可实现
error接口并嵌入*echo.HTTPError,便于在HTTPErrorHandler中类型断言处理
echo.NewHTTPError,并在最顶层配好 HTTPErrorHandler。漏掉任何一个环节(比如某个中间件手写了 c.JSON),整条链就断了。










