Gin: Batalkan vs panik

Dibuat pada 14 Jun 2015  ·  3Komentar  ·  Sumber: gin-gonic/gin

setiap kali saya ingin mengembalikan kesalahan, saya harus menulis kode berikut

if err != nil {
    c.AbortWithError(code, err)
    return
}

itu jelek dengan begitu banyak return

Saya pikir menggunakan panik mungkin praktik terbaik. Seperti Java throw Exception

if err != nil {
    panic(err) // maybe err is ErrUserNotFound
}

err didefinisikan sebagai

type HTTPError interface {
    HTTPStatus() int
}

menggunakan middleware catchError untuk menangkap kesalahan dan membatalkan dengan 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()
    }
}

banyak dari jelek return dihapus

bug wontfix

Komentar yang paling membantu

Tip: ubah kode Anda menjadi fungsi yang lebih kecil, jadi alih-alih mengulang:

if err != nil {
    c.AbortWithStatus(code, error)
    return 
}

Anda melakukan:

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;
    }
    // ...
}

Semua 3 komentar

@lilee saat ini praktik terbaik adalah melakukan:

AbortWithError()
return;

dan kemudian middleware membaca c.Errors untuk melakukan sesuatu dengan kesalahan.

Menggunakan panic () adalah ide yang buruk:

  • Ini bukanlah Go idiomatic. Di Go, panic () adalah pengecualian ketat (atau pernyataan). yaitu sesuatu yang sangat buruk (mungkin bug) terjadi.
  • Memanggil panic () lambat
  • Saat panic () dipanggil, sebagian besar middlewares tidak akan berfungsi dengan benar, karena panic () biasanya berarti 500.
  • Debugging: Anda tidak akan dapat membedakan antara error yang sebenarnya (seperti access no nil) dan error.

Tentu saja, Anda bebas menggunakan apa pun yang Anda inginkan, tetapi menggunakan panic () untuk mengontrol aliran normal logika adalah anti-pola di Go.

Tip: ubah kode Anda menjadi fungsi yang lebih kecil, jadi alih-alih mengulang:

if err != nil {
    c.AbortWithStatus(code, error)
    return 
}

Anda melakukan:

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;
    }
    // ...
}

Terima kasih atas penjelasannya

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

iiinsomnia picture iiinsomnia  ·  3Komentar

wangcn picture wangcn  ·  3Komentar

kekemuyu picture kekemuyu  ·  3Komentar

oryband picture oryband  ·  3Komentar

xpbliss picture xpbliss  ·  3Komentar