1.1. 错误处理程序
Echo 提倡通过中间件或处理程序 (handler) 返回 HTTP 错误集中处理。集中式错误处理程序允许我们从统一位置将错误记录到外部服务,并向客户端发送自定义 HTTP 响应。
你可以返回一个标准的 error
或者 echo.*HTTPError
。
例如,当基本身份验证中间件找到无效凭据时,会返回 401未授权错误 (401-Unauthorized),并终止当前的 HTTP 请求。
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
// Extract the credentials from HTTP request header and perform a security
// check
// For invalid credentials
return echo.NewHTTPError(http.StatusUnauthorized)
// For valid credentials call next
// return next(c)
}
})
}
你也可以不带消息内容调用 echo.NewHTTPError()
,这种情况下状态文本会被用作错误信息,例如 Unauthorized
。
1.2. 默认 HTTP 错误处理程序
Echo 提供了默认的 HTTP 错误处理程序,它用 JSON 格式发送错误。
{
"message": "error connecting to redis"
}
标准错误 error
的响应是 500 - Internal Server Error
。然而在调试 (debug) 模式模式下,原始的错误信息会被发送。如果错误是 *HTTPError
,则使用设置的状态代码和消息发送响应。如果启用了日志记录,则还会记录错误消息。
1.3. 自定义 HTTP 错误处理程序
通过 e.HTTPErrorHandler
可以设置自定义的 HTTP 错误处理程序 (error handler) 。
通常默认的 HTTP 错误处理程序已经够用;然而如果要获取不同类型的错误并采取相应的操作,则可以使用自定义 HTTP 错误处理程序,例如发送通知邮件或记录日志到应用中心的场景。最后,你还可以发送自定义的错误页面或 JSON 响应给客户端。
1.3.1. 错误页
利用自定义 HTTP 错误处理程序,可以在显示不同种类的错误页面的同时,记录错误日志。错误页的名称可写作 <CODE>.html
,例如 500.html
。你可以在https://github.com/AndiDittrich/HttpErrorPages看到 Echo 内置的错误页。
func customHTTPErrorHandler(err error, c echo.Context) {
code := http.StatusInternalServerError
if he, ok := err.(*echo.HTTPError); ok {
code = he.Code
}
errorPage := fmt.Sprintf("%d.html", code)
if err := c.File(errorPage); err != nil {
c.Logger().Error(err)
}
c.Logger().Error(err)
}
e.HTTPErrorHandler = customHTTPErrorHandler
日志除了记录到 logger,也可以记录到第三方服务,例如 Elasticsearch 或者 Splunk。