Heim >Backend-Entwicklung >Golang >Fehlerbehandlung im Golang-Gin-Framework
Die Standardfehlerbehandlung ist „errors.New(“error information“). Diese Informationen werden über den Rückgabewert des Fehlertyps zurückgegeben.
Empfohlen: Golang-Tutorial
Ein einfaches Beispiel:
func hello(name string) (str string, err error) { if name == "" { err = errors.New("name 不能为空") return } str = fmt.Sprintf("hello: %s", name) return }
Beim Aufruf dieser Methode:
var name = "" str, err := hello(name) if err != nil { fmt.Println(err.Error()) return }
Dieser Standard Bei der Fehlerbehandlung wird lediglich eine Zeichenfolge mit Fehlerinformationen abgerufen.
Benutzerdefinierte Fehlerbehandlung
Wir definieren ein alarm.go, um Alarme zu verarbeiten.
Schauen wir uns ohne weitere Umschweife einfach den Code an.
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" { // 执行记日志 } }
Sehen Sie sich an, wie man aufruft:
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 }
Besuchen Sie: http://localhost:8080/v1/product/add?name=a
{ "code": 1, "msg": "hello: a", "data": null }
Es wird kein Fehler ausgegeben, Es werden keine Informationen ausgegeben.
Besuch: http://localhost:8080/v1/product/add
{ "code": -1, "msg": "name 不能为空", "data": null }
hat einen Fehler ausgegeben, die Ausgabeinformationen lauten wie folgt:
{"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能为空","filename":"绝对路径/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}
Panik und wiederherstellen
Panic sollte verwendet werden, um einen Fehler auszulösen, wenn das Programm nicht weiter ausgeführt werden kann.
Wenn ein Programm in Panik gerät, kann die Wiederherstellung zur Steuerung innerhalb von defer (Verzögerungsfunktion) aufgerufen werden. Es gibt jedoch eine Voraussetzung, dass dies nur in derselben Go-Coroutine erfolgen kann.
Absichtliche Panik:
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") }
Ausgabe:
-- 1 -- panic: i am panic -- 2 --
Absichtliche Panik:
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 }
Ausgabe:
-- 1 -- panic: runtime error: index out of range -- 2 --
Das obige ist der detaillierte Inhalt vonFehlerbehandlung im Golang-Gin-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!