默認(rèn)的錯(cuò)誤處理是 errors.New("錯(cuò)誤信息"),這個(gè)信息通過(guò) error 類型的返回值進(jìn)行返回。
堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都紙箱小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設(shè)營(yíng)銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。舉個(gè)簡(jiǎn)單的例子:
func hello(name string) (str string, err error) { if name == "" { err = errors.New("name 不能為空") return } str = fmt.Sprintf("hello: %s", name) return }
當(dāng)調(diào)用這個(gè)方法時(shí):
var name = "" str, err := hello(name) if err != nil { fmt.Println(err.Error()) return }
這個(gè)默認(rèn)的錯(cuò)誤處理,只是得到了一個(gè)錯(cuò)誤信息的字符串。
自定義錯(cuò)誤處理
咱們定義一個(gè) alarm.go,用于處理告警。
廢話不多說(shuō),直接看代碼。
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} } // 發(fā)郵件 func Email (text string) error { alarm("EMAIL", text) return &errorString{text} } // 發(fā)短信 func Sms (text string) error { alarm("SMS", text) return &errorString{text} } // 發(fā)微信 func WeChat (text string) error { alarm("WX", text) return &errorString{text} } // 告警方法 func alarm(level string, str string) { // 當(dāng)前時(shí)間 currentTime := function.GetTimeStr() // 定義 文件名、行號(hào)、方法名 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" { // 執(zhí)行發(fā)郵件 } else if level == "SMS" { // 執(zhí)行發(fā)短信 } else if level == "WX" { // 執(zhí)行發(fā)微信 } else if level == "INFO" { // 執(zhí)行記日志 } }
看下如何調(diào)用:
package v1 import ( "fmt" "ginDemo/common/alarm" "ginDemo/entity" "github.com/gin-gonic/gin" "net/http" ) func AddProduct(c *gin.Context) { // 獲取 Get 參數(shù) 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 }
訪問(wèn):http://localhost:8080/v1/product/add?name=a
{ "code": 1, "msg": "hello: a", "data": null }
未拋出錯(cuò)誤,不會(huì)輸出信息。
訪問(wèn):http://localhost:8080/v1/product/add
{ "code": -1, "msg": "name 不能為空", "data": null }
拋出了錯(cuò)誤,輸出信息如下:
{"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能為空","filename":"絕對(duì)路徑/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}
panic 和 recover
當(dāng)程序不能繼續(xù)運(yùn)行的時(shí)候,才應(yīng)該使用 panic 拋出錯(cuò)誤。
當(dāng)程序發(fā)生 panic 后,在 defer(延遲函數(shù)) 內(nèi)部可以調(diào)用 recover 進(jìn)行控制,不過(guò)有個(gè)前提條件,只有在相同的 Go 協(xié)程中才可以。
有意拋出的 panic:
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") }
輸出:
-- 1 -- panic: i am panic -- 2 --
無(wú)意拋出的 panic:
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 }
輸出:
-- 1 -- panic: runtime error: index out of range -- 2 --
以上就是golang gin框架錯(cuò)誤處理的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!