免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

go語言中g(shù)in框架的錯誤處理-創(chuàng)新互聯(lián)

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

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都紙箱小微創(chuàng)業(yè)公司專業(yè)提供企業(yè)網(wǎng)站建設(shè)營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

舉個簡單的例子:

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)用這個方法時:

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

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

自定義錯誤處理

咱們定義一個 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) {
	// 當(dāng)前時間
	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í)行記日志
	}
}

看下如何調(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
}

訪問: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

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

當(dāng)程序發(fā)生 panic 后,在 defer(延遲函數(shù)) 內(nèi)部可以調(diào)用 recover 進(jìn)行控制,不過有個前提條件,只有在相同的 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 --

無意拋出的 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框架錯誤處理的詳細(xì)內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

網(wǎng)站欄目:go語言中g(shù)in框架的錯誤處理-創(chuàng)新互聯(lián)
文章URL:http://m.newbst.com/article38/dgjspp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站做網(wǎng)站商城網(wǎng)站網(wǎng)站建設(shè)網(wǎng)站排名定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)