Heim  >  Artikel  >  Backend-Entwicklung  >  Fehlerbehandlung im Golang-Gin-Framework

Fehlerbehandlung im Golang-Gin-Framework

尚
Original
2019-12-12 11:56:224462Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn