La gestion des erreurs par défaut est erreurs.New("informations sur l'erreur"). Ces informations sont renvoyées via la valeur de retour du type d'erreur.
Recommandé : Tutoriel Golang
Un exemple simple :
func hello(name string) (str string, err error) { if name == "" { err = errors.New("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return }
Lors de l'appel de cette méthode :
var name = "" str, err := hello(name) if err != nil { fmt.Println(err.Error()) return }
Cette valeur par défaut la gestion des erreurs obtient simplement une chaîne d’informations sur l’erreur.
Gestion personnalisée des erreurs
Nous définissons un alarm.go pour gérer les alarmes.
Sans plus tarder, regardons simplement le code.
package alarm import ( "encoding/json" "fmt" "ginDemo/common/function" "path/filepath" "runtime" "strings" ) type errorString struct { s string } type errorInfo struct { Time string `json:"time"` Alarm string `json:"alarm"` Message string `json:"message"` Filename string `json:"filename"` Line int `json:"line"` Funcname string `json:"funcname"` } func (e *errorString) Error() string { return e.s } func New (text string) error { alarm("INFO", text) return &errorString{text} } // 发邮件 func Email (text string) error { alarm("EMAIL", text) return &errorString{text} } // 发短信 func Sms (text string) error { alarm("SMS", text) return &errorString{text} } // 发微信 func WeChat (text string) error { alarm("WX", text) return &errorString{text} } // 告警方法 func alarm(level string, str string) { // 当前时间 currentTime := function.GetTimeStr() // 定义 文件名、行号、方法名 fileName, line, functionName := "?", 0 , "?" pc, fileName, line, ok := runtime.Caller(2) if ok { functionName = runtime.FuncForPC(pc).Name() functionName = filepath.Ext(functionName) functionName = strings.TrimPrefix(functionName, ".") } var msg = errorInfo { Time : currentTime, Alarm : level, Message : str, Filename : fileName, Line : line, Funcname : functionName, } jsons, errs := json.Marshal(msg) if errs != nil { fmt.Println("json marshal error:", errs) } errorJsonInfo := string(jsons) fmt.Println(errorJsonInfo) if level == "EMAIL" { // 执行发邮件 } else if level == "SMS" { // 执行发短信 } else if level == "WX" { // 执行发微信 } else if level == "INFO" { // 执行记日志 } }
Voir comment appeler :
package v1 import ( "fmt" "ginDemo/common/alarm" "ginDemo/entity" "github.com/gin-gonic/gin" "net/http" ) func AddProduct(c *gin.Context) { // 获取 Get 参数 name := c.Query("name") var res = entity.Result{} str, err := hello(name) if err != nil { res.SetCode(entity.CODE_ERROR) res.SetMessage(err.Error()) c.JSON(http.StatusOK, res) c.Abort() return } res.SetCode(entity.CODE_SUCCESS) res.SetMessage(str) c.JSON(http.StatusOK, res) } func hello(name string) (str string, err error) { if name == "" { err = alarm.WeChat("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return }
Visitez : http://localhost:8080/v1/product/add?name=a
{ "code": 1, "msg": "hello: a", "data": null }
Aucune erreur n'est générée, Aucune information ne sera émise.
Visite : http://localhost:8080/v1/product/add
{ "code": -1, "msg": "name 不能为空", "data": null }
a généré une erreur, les informations de sortie sont les suivantes :
{"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能为空","filename":"绝对路径/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}
panique et récupérer
Lorsque le programme ne peut pas continuer à s'exécuter, la panique doit être utilisée pour générer une erreur.
Lorsqu'un programme panique, la récupération peut être appelée dans defer (fonction de retard) pour le contrôle, mais il y a une condition préalable, cela ne peut être fait que dans la même coroutine Go.
Panique intentionnelle :
package main import ( "fmt" ) func main() { fmt.Println("-- 1 --") defer func() { if r := recover(); r != nil { fmt.Printf("panic: %s\n", r) } fmt.Println("-- 2 --") }() panic("i am panic") }
Sortie :
-- 1 -- panic: i am panic -- 2 --
Panique intentionnelle :
package main import ( "fmt" ) func main() { fmt.Println("-- 1 --") defer func() { if r := recover(); r != nil { fmt.Printf("panic: %s\n", r) } fmt.Println("-- 2 --") }() var slice = [] int {1, 2, 3, 4, 5} slice[6] = 6 }
Sortie :
-- 1 -- panic: runtime error: index out of range -- 2 --
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!