エラーを返したいときは、次のコードを書く必要があります
if err != nil {
c.AbortWithError(code, err)
return
}
return
たくさんあるのは醜いです
パニックを使用することがおそらくベストプラクティスだと思います。 Javaのthrow Exception
if err != nil {
panic(err) // maybe err is ErrUserNotFound
}
エラーは次のように定義されます
type HTTPError interface {
HTTPStatus() int
}
catchErrorミドルウェアを使用してエラーをキャッチし、 HTTPStatus
中止します
func catchError() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
switch err.(type) {
case HTTPError:
e := err.(*errors.Error)
c.JSON(e.HTTPStatus(), e)
c.Abort()
default:
c.AbortWithStatus(http.StatusInternalServerError)
}
}
}()
c.Next()
}
}
醜いreturn
多くが削除されます
@lileeの現在のベストプラクティスは、次のことです。
AbortWithError()
return;
次に、ミドルウェアはエラーを処理するためにc.Errors
を読み取ります。
panic()を使用することは悪い考えです:
もちろん、好きなものを自由に使用できますが、panic()を使用してロジックの通常のフローを制御することは、Goのアンチパターンです。
ヒント:コードをより小さな関数にリファクタリングするので、繰り返す代わりに:
if err != nil {
c.AbortWithStatus(code, error)
return
}
あなたがやる:
func dosomething() error {
err = dosomething1()
if err != nil {
return err
}
err = dosomething2()
if err != nil {
return err
}
err = dosomething3()
if err != nil {
return err
}
}
func handler(c *gin.Context) {
err := dosomething()
if err != nil {
c.AbortWithStatus(400, err)
return;
}
// ...
}
説明ありがとうございます
最も参考になるコメント
ヒント:コードをより小さな関数にリファクタリングするので、繰り返す代わりに:
あなたがやる: