ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Ρ Ρ ΠΎΡΡ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ, Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄
if err != nil {
c.AbortWithError(code, err)
return
}
ΡΡΠΎ ΡΡΠΎΠ΄Π»ΠΈΠ²ΠΎ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ return
Π― Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΏΠ°Π½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΡΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ. ΠΠ°ΠΊ Java throw Exception
if err != nil {
panic(err) // maybe err is ErrUserNotFound
}
err ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ
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;
}
// ...
}
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π‘ΠΎΠ²Π΅Ρ: ΡΠ΅ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ΄ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ:
ΡΡ ΡΠ΄Π΅Π»Π°Π΅ΡΡ: