站長資訊網
        最全最豐富的資訊網站

        golang gin框架錯誤處理

        golang gin框架錯誤處理

        默認的錯誤處理是 errors.New("錯誤信息"),這個信息通過 error 類型的返回值進行返回。

        推薦:golang教程

        舉個簡單的例子:

        func hello(name string) (str string, err error) { 	if name == "" { 		err = errors.New("name 不能為空") 		return 	} 	str = fmt.Sprintf("hello: %s", name) 	return }

        當調用這個方法時:

        var name = "" str, err :=  hello(name) if err != nil { 	fmt.Println(err.Error()) 	return }

        這個默認的錯誤處理,只是得到了一個錯誤信息的字符串。

        自定義錯誤處理

        咱們定義一個 alarm.go,用于處理告警。

        廢話不多說,直接看代碼。

        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) { 	// 當前時間 	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" { 		// 執(zhí)行發(fā)郵件  	} else if level == "SMS" { 		// 執(zhí)行發(fā)短信  	} else if level == "WX" { 		// 執(zhí)行發(fā)微信  	} else if level == "INFO" { 		// 執(zhí)行記日志 	} }

        看下如何調用:

        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 }

        訪問:http://localhost:8080/v1/product/add?name=a

        {     "code": 1,     "msg": "hello: a",     "data": null }

        未拋出錯誤,不會輸出信息。

        訪問:http://localhost:8080/v1/product/add

        {     "code": -1,     "msg": "name 不能為空",     "data": null }

        拋出了錯誤,輸出信息如下:

        {"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能為空","filename":"絕對路徑/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}

        panic 和 recover

        當程序不能繼續(xù)運行的時候,才應該使用 panic 拋出錯誤。

        當程序發(fā)生 panic 后,在 defer(延遲函數) 內部可以調用 recover 進行控制,不過有個前提條件,只有在相同的 Go 協(xié)程中才可以。

        有意拋出的 panic:

        package main  import ( 	"fmt" )  func main() {  	fmt.Println("-- 1 --")  	defer func() { 		if r := recover(); r != nil { 			fmt.Printf("panic: %sn", r) 		} 		fmt.Println("-- 2 --") 	}() 	 	panic("i am panic") }

        輸出:

        -- 1 -- panic: i am panic -- 2 --

        無意拋出的 panic:

        package main  import ( 	"fmt" )  func main() {  	fmt.Println("-- 1 --")  	defer func() { 		if r := recover(); r != nil { 			fmt.Printf("panic: %sn", r) 		} 		fmt.Println("-- 2 --") 	}()   	var slice = [] int {1, 2, 3, 4, 5}  	slice[6] = 6 }

        輸出:

        -- 1 -- panic: runtime error: index out of range -- 2 --

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品国产一区二区三区不卡| 国产亚洲精品美女久久久| 亚洲国产精品国自产拍AV| 精品国内片67194| 久久久无码精品亚洲日韩按摩| 国内精品免费久久影院| 青青青青久久精品国产h| 国产精品免费无遮挡无码永久视频 | 午夜精品免费在线观看| 久久久一本精品99久久精品88| 四库影院永久四虎精品国产 | 九九在线精品视频专区| 久久亚洲精品人成综合网| 亚洲精品tv久久久久久久久久| 精品久久久久久99人妻| 国产精品成人久久久久三级午夜电影| 久久精品视频网| 99久久久精品| 2021精品国产综合久久| 日产精品久久久久久久性色| 午夜欧美精品久久久久久久| 中文字幕精品一区二区精品| 日本精品一区二区三区四区| 国产在AJ精品| 国产精品成人观看视频| 99久久国产综合精品成人影院| 国产精品三级国产电影| 国内精品伊人久久久久AV影院| 久久国产精品一国产精品金尊| 日韩一区精品视频一区二区| 无码日韩精品一区二区免费| 亚洲AV日韩精品久久久久久| 无码国产乱人伦偷精品视频| 欧美精品久久久久久久自慰| 久久久精品人妻一区二区三区蜜桃 | 亚洲精品视频在线| 日韩精品一区二区三区四区| 日韩欧美精品不卡| 97精品伊人久久久大香线蕉| 国产精品极品| 久久精品国产第一区二区|