Maison > développement back-end > Golang > le corps du texte

gestion des erreurs du framework Golang Gin

Libérer: 2019-12-12 11:56:22
original
4449 Les gens l'ont consulté

gestion des erreurs du framework Golang Gin

La gestion des erreurs par défaut est erreurs.New("informations sur l'erreur"). Ces informations sont renvoyées via la valeur de retour du type d'erreur.

Recommandé : Tutoriel Golang

Un exemple simple :

func hello(name string) (str string, err error) {
	if name == "" {
		err = errors.New("name 不能为空")
		return
	}
	str = fmt.Sprintf("hello: %s", name)
	return
}
Copier après la connexion

Lors de l'appel de cette méthode :

var name = ""
str, err :=  hello(name)
if err != nil {
	fmt.Println(err.Error())
	return
}
Copier après la connexion

Cette valeur par défaut la gestion des erreurs obtient simplement une chaîne d’informations sur l’erreur.

Gestion personnalisée des erreurs

Nous définissons un alarm.go pour gérer les alarmes.

Sans plus tarder, regardons simplement le code.

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" {
		// 执行记日志
	}
}
Copier après la connexion

Voir comment appeler :

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
}
Copier après la connexion

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

{
    "code": 1,
    "msg": "hello: a",
    "data": null
}
Copier après la connexion

Aucune erreur n'est générée, Aucune information ne sera émise.

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

{
    "code": -1,
    "msg": "name 不能为空",
    "data": null
}
Copier après la connexion

a généré une erreur, les informations de sortie sont les suivantes :

{"time":"2019-07-23 22:19:17","alarm":"WX","message":"name 不能为空","filename":"绝对路径/ginDemo/router/v1/product.go","line":33,"funcname":"hello"}
Copier après la connexion

panique et récupérer

Lorsque le programme ne peut pas continuer à s'exécuter, la panique doit être utilisée pour générer une erreur.

Lorsqu'un programme panique, la récupération peut être appelée dans defer (fonction de retard) pour le contrôle, mais il y a une condition préalable, cela ne peut être fait que dans la même coroutine Go.

Panique intentionnelle :

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")
}
Copier après la connexion

Sortie :

-- 1 --
panic: i am panic
-- 2 --
Copier après la connexion

Panique intentionnelle :

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
}
Copier après la connexion

Sortie :

-- 1 --
panic: runtime error: index out of range
-- 2 --
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal