【Go】Echo エラー処理を実装する
apiサーバーの実装でとりあえずのエラー処理中。とりあえず以下をハンドリングするような想定で。
・ビジネスエラー
・システムエラー
・404エラー
・その他サーバーエラー
ディレクトリ構成はこんな感じ
$ tree -L 3 . └── app ├── controller │ └── traking.go ├── error │ ├── business.go │ └── system.go ├── handler │ └── handler.go ├── main.go
独自エラーの実装
Messageはユーザーに伝えるメッセージ。
LogMessageはログとかに残すメッセージ(後で実装する予定)
app/error/system.go
package error import( "fmt" ) type SystemError struct { Message string LogMessage string } func (err *SystemError) Error() string { return fmt.Sprintf("%s", err.Message) }
エラーハンドリング
とりあえずJSONをかえすところまで実装。
app/handler/handler.go
package handler import( AppErr "app/error" "net/http" "github.com/labstack/echo" ) type ApiError struct { Status int `json:status` Message string `json:message` } func JSONErrorHandler(err error, c echo.Context) { switch e := err.(type) { case *AppErr.BusinessError: // Business Error c.JSON( http.StatusOK, ApiError{ Status: 200, Message: e.Message, }) case *AppErr.SystemError: // System Error c.JSON(http.StatusOK, ApiError{ Status: 500, Message: e.Message, }) default: if he, ok := err.(*echo.HTTPError); ok { if he.Code == 404 { // 404 c.JSON(he.Code, ApiError{ Status: he.Code, Message: "Not Found", }) } else { // その他サーバーエラー c.JSON(he.Code, ApiError{ Status: he.Code, Message: "System Error", }) } } } }
main.go
package main import ( AppErr "app/error" "app/handler" ) func main() { e := echo.New() e.GET("/users", func(c echo.Contet) error { return &AppErr.System{ Message: "システムエラーだよ" } // return echo.NewHTTPError(http.StatusInternalServerError, "Server Error") // return echo.NewHTTPError(http.StatusNotFound, "Not Found") }) e.HTTPErrorHandler = handler.JSONErrorHandler e.Start(":8080") }
とりあえずやりたいことはできた。色々実装したら全然足りなそうだけど一旦はこれで。以上です。