错误处理程序

Echo 提倡通过中间件或处理程序 (handler) 返回 HTTP 错误集中处理。集中式错误处理程序允许我们从统一位置将错误记录到外部服务,并向客户端发送自定义 HTTP 响应。

你可以返回一个标准的 error 或者 echo.*HTTPError

例如,当基本身份验证中间件找到无效凭据时,会返回 401未授权错误 (401-Unauthorized),并终止当前的 HTTP 请求。

  1. e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
  2. return func(c echo.Context) error {
  3. // Extract the credentials from HTTP request header and perform a security
  4. // check
  5. // For invalid credentials
  6. return echo.NewHTTPError(http.StatusUnauthorized)
  7. // For valid credentials call next
  8. // return next(c)
  9. }
  10. })
  11. }

你也可以不带消息内容调用 echo.NewHTTPError(),这种情况下状态文本会被用作错误信息,例如 Unauthorized

默认 HTTP 错误处理程序

Echo 提供了默认的 HTTP 错误处理程序,它用 JSON 格式发送错误。

  1. {
  2. "message": "error connecting to redis"
  3. }

标准错误 error 的响应是 500 - Internal Server Error。然而在调试 (debug) 模式模式下,原始的错误信息会被发送。如果错误是 *HTTPError,则使用设置的状态代码和消息发送响应。如果启用了日志记录,则还会记录错误消息。

自定义 HTTP 错误处理程序

通过 e.HTTPErrorHandler 可以设置自定义的 HTTP 错误处理程序 (error handler) 。

通常默认的 HTTP 错误处理程序已经够用;然而如果要获取不同类型的错误并采取相应的操作,则可以使用自定义 HTTP 错误处理程序,例如发送通知邮件或记录日志到应用中心的场景。最后,你还可以发送自定义的错误页面或 JSON 响应给客户端。

错误页

利用自定义 HTTP 错误处理程序,可以在显示不同种类的错误页面的同时,记录错误日志。错误页的名称可写作 <CODE>.html,例如 500.html。你可以在https://github.com/AndiDittrich/HttpErrorPages看到 Echo 内置的错误页。

  1. func customHTTPErrorHandler(err error, c echo.Context) {
  2. code := http.StatusInternalServerError
  3. if he, ok := err.(*echo.HTTPError); ok {
  4. code = he.Code
  5. }
  6. errorPage := fmt.Sprintf("%d.html", code)
  7. if err := c.File(errorPage); err != nil {
  8. c.Logger().Error(err)
  9. }
  10. c.Logger().Error(err)
  11. }
  12. e.HTTPErrorHandler = customHTTPErrorHandler

日志除了记录到 logger,也可以记录到第三方服务,例如 Elasticsearch 或者 Splunk。