Skip to content

Commit

Permalink
♻️ Fix: error handler
Browse files Browse the repository at this point in the history
  • Loading branch information
naohito-T committed Apr 21, 2024
1 parent 8fb8c62 commit b909b7a
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 20 deletions.
29 changes: 29 additions & 0 deletions backend/domain/customerror/code.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package customerror

// ApplicationError はアプリケーション特有のエラー情報を保持する基本構造体です。
type ApplicationErrorCode struct {
// StatusCode(JSON parseでは構造体省略)
Status int `json:"-"`
// Code はエラーコードを表します。
Code string `json:"code"`
// Message はエラーメッセージを表します。
Message string `json:"message"`
}

var (
WrongEmailVerificationCode ApplicationErrorCode = ApplicationErrorCode{
Code: "WRONG_EMAIL_VERIFICATION_ERROR",
Message: "Wrong email verification code",
}

// Unknown Error: システムがエラーの原因を特定できないか、エラーの種類が分類されていない場合に使用する。
UnknownCode ApplicationErrorCode = ApplicationErrorCode{
Code: "unknown_error",
Message: "unknown_error",
}

UnexpectedCode ApplicationErrorCode = ApplicationErrorCode{
Code: "unexpected_error",
Message: "unexpected_error",
}
)
13 changes: 9 additions & 4 deletions backend/domain/customerror/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,17 @@ import (

// ApplicationError はアプリケーション特有のエラー情報を保持する基本構造体です。
type ApplicationError struct {
Code int
Message string
// StatusCode(JSON parseでは構造体省略)
Status int `json:"-"`
// Code はエラーコードを表します。
Code string `json:"code"`
// Message はエラーメッセージを表します。
Message string `json:"message"`
}

// Error メソッドは error インターフェースを実装します。
func (e *ApplicationError) Error() string {
return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
return fmt.Sprintf("Code: %s, Message: %s", e.Code, e.Message)
}

// WrongEmailVerificationError は特定の条件下で利用されるカスタムエラーです。
Expand All @@ -30,7 +34,8 @@ func NewWrongEmailVerificationError(isTally, isRedirect bool, redirectQuery stri
q, _ := url.ParseQuery(redirectQuery)
return &WrongEmailVerificationError{
ApplicationError: ApplicationError{
Code: http.StatusBadRequest,
Status: http.StatusBadRequest,
Code: "WRONG_EMAIL_VERIFICATION_ERROR",
Message: "Wrong email verification code",
},
IsTally: isTally,
Expand Down
30 changes: 14 additions & 16 deletions backend/internal/rest/middleware/error/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package error

import (
"errors"
"net/http"

"github.com/labstack/echo/v4"
"github.com/naohito-T/tinyurl/backend/domain/customerror"
Expand All @@ -15,22 +14,21 @@ import (
// この型アサーションを使うことで、安全に型変換を行いつつ、エラーチェックを同時に実施できます。
func CustomErrorHandler(err error, c echo.Context) {
c.Logger().Error("カスタムエラーに入ったよ")
if errors.Is(err, customerror.WrongEmailVerificationErrorInstance) {
c.Logger().Error("これがWrongEmailVerificationErrorアプリケーションエラー")
}
he, ok := err.(*echo.HTTPError)
if !ok {
he = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
// ロギング
c.Logger().Error(err)
// c.Logger().Error(err)
appErr := buildError(err, c)
c.JSON(appErr.Status, map[string]string{"code": appErr.Code, "message": appErr.Message})

Check failure on line 20 in backend/internal/rest/middleware/error/error.go

View workflow job for this annotation

GitHub Actions / lint-backend

Error return value of `c.JSON` is not checked (errcheck)
}

// エラーレスポンスを送信する例
if err := c.JSON(he.Code, map[string]string{"message": he.Message.(string)}); err != nil {
c.Logger().Error(err)
func buildError(err error, c echo.Context) *customerror.ApplicationError {
appErr := customerror.ApplicationError{
Status: customerror.UnexpectedCode.Status,
Code: customerror.UnexpectedCode.Code,
Message: customerror.UnexpectedCode.Message,
}
if errors.Is(err, customerror.WrongEmailVerificationErrorInstance) {
c.Logger().Error("これがWrongEmailVerificationErrorアプリケーションエラー")
// return &customerror.ApplicationError{}
}
return &appErr
}

// func buildError(err error, code int) *echo.HTTPError {

// }

0 comments on commit b909b7a

Please sign in to comment.