Fehlerbehandlung im Golang-Gin-Framework

Freigeben: 2019-12-12 11:56:22
Original
4428 Leute haben es durchsucht

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
}
Nach dem Login kopieren

Beim Aufruf dieser Methode:

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

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" {
		// 执行记日志
	}
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

Besuchen Sie: http://localhost:8080/v1/product/add?name=a

{
    "code": 1,
    "msg": "hello: a",
    "data": null
}
Nach dem Login kopieren

Es wird kein Fehler ausgegeben, Es werden keine Informationen ausgegeben.

Besuch: http://localhost:8080/v1/product/add

{
    "code": -1,
    "msg": "name 不能为空",
    "data": null
}
Nach dem Login kopieren

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"}
Nach dem Login kopieren

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")
}
Nach dem Login kopieren

Ausgabe:

-- 1 --
panic: i am panic
-- 2 --
Nach dem Login kopieren

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
}
Nach dem Login kopieren

Ausgabe:

-- 1 --
panic: runtime error: index out of range
-- 2 --
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!