beego 的 404/500 页面必须显式注册,不注册则使用默认页;可通过 beego.errorhandler("404", handler) 全局注册标准状态码处理器,或用 beego.errorcontroller(&errcontroller{}) 配合 error404() 等约定方法实现模板复用,但需确保注册在 beego.run() 前、模板路径正确、并关闭默认 recover(beego.bconfig.recoverpanic = false)以使自定义 500 生效。

Beego 的 404/500 页面必须显式注册,不注册就永远用默认页——它不会自动 fallback 到模板或 panic 捕获逻辑。
beego.ErrorHandler("404", handler) 是最直接的注册方式
Beego 提供了全局错误处理器注册接口,beego.ErrorHandler 是唯一能接管标准 HTTP 状态码(如 "404"、"500")的入口。它不依赖控制器、不走路由匹配,只要请求最终走到 Beego 的响应阶段且状态码匹配,就会触发。
- 必须在
beego.Run()之前调用,否则无效 - handler 函数签名固定为
func(http.ResponseWriter, *http.Request),不能用*context.Context或*Controller - 模板路径需手动拼接:
beego.BConfig.WebConfig.ViewsPath + "/404.html",不能只写"404.html" - 如果用了模板引擎(如
html/template),记得ParseFiles后再Execute,别漏掉data := make(map[string]interface{})传参步骤
ErrorController 方式更灵活但要求严格对齐方法名
用 beego.ErrorController(&controllers.ErrController{}) 注册后,Beego 会按约定方法名分发错误:比如 404 触发 Error404(),500 触发 Error500()。这比 ErrorHandler 更易复用 c.Data 和 c.TplName。
- 结构体必须嵌入
beego.Controller,不能是组合或指针字段 - 方法名必须以
Error开头 + 状态码(如Error404),大小写敏感;Error404()有效,Error404Page()无效 -
c.TplName必须指向真实存在的模板文件,例如"404.tpl"对应views/404.tpl,路径和后缀必须完全一致 - Beego 不会自动渲染,仍需确保
beego.Run()被调用,否则模板引擎未初始化,TplName被静默忽略
500 页面不显示?大概率是 panic 被默认 recover 截胡了
Beego 默认开启 recoverpanic = true,它会在每个请求 goroutine 中捕获 panic 并返回纯文本 500 响应(含堆栈),根本不会走到你注册的 ErrorHandler 或 ErrorController。
- 想让自定义 500 页面生效,必须关掉默认恢复:
beego.BConfig.RecoverPanic = false - 关掉之后,panic 会导致连接中断或空响应——所以你还得自己加
defer/recover,且必须放在每个 Controller 方法内(main() 里的 defer 无效) - 在 recover 块里手动调用
c.Abort("500")或直接写c.Ctx.ResponseWriter.WriteHeader(500)+ 渲染逻辑 - 注意:
c.Abort("500")默认返回状态码 200,必须配合c.Ctx.ResponseWriter.WriteHeader(500)才真正生效
404 总是空白或 Nginx 默认页?检查请求是否真进了 Beego
Beego 只处理「已到达应用层但无路由匹配」的 404,它不控制 Web 服务器层的 404。如果你看到 Nginx 的 404 页面,说明请求压根没转发给 Beego。
- 用
curl -v http://localhost:8080/nonexistent直连 Beego 进程,确认是否返回你设的页面 - 检查反向代理配置:Nginx 的
location /必须有proxy_pass http://127.0.0.1:8080,且不能带error_page 404指令劫持 - 确认 Beego 路由注册完整:
routers/router.go里所有路径都通过beego.Router或beego.RESTRouter显式声明,漏一条就可能被当成 404 - 静态资源(如
/static/xxx.css)若没配beego.SetStaticPath,也会触发 Beego 层 404,而非 Nginx 层
最容易被忽略的是:Beego 的错误处理不是“开箱即用”的中间件,它依赖精确的函数签名、注册时机、模板路径和运行时配置三者同时满足。少一个条件,就退回默认页——而且不会报错,只会静默失效。











