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
@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:
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
Komentar yang paling membantu
Tip: ubah kode Anda menjadi fungsi yang lebih kecil, jadi alih-alih mengulang:
Anda melakukan: