## 錯誤處理程序
Echo 提倡通過中間件或處理程序 (handler) 返回 HTTP 錯誤集中處理。集中式錯誤處理程序允許我們從統一位置將錯誤記錄到外部服務,并向客戶端發送自定義 HTTP 響應。
你可以返回一個標準的 `error` 或者 `echo.*HTTPError`。
例如,當基本身份驗證中間件找到無效憑據時,會返回 401未授權錯誤 (401-Unauthorized),并終止當前的 HTTP 請求。
```go
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`。
## 默認 HTTP 錯誤處理程序
Echo 提供了默認的 HTTP 錯誤處理程序,它用 JSON 格式發送錯誤。
```
{
"message": "error connecting to redis"
}
```
標準錯誤 `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](https://github.com/AndiDittrich/HttpErrorPages)看到 Echo 內置的錯誤頁。
```go
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。