Aller à la gestion des erreurs


Le langage Go fournit un mécanisme de gestion des erreurs très simple via l'interface d'erreur intégrée.

Le type d'erreur est un type d'interface, voici sa définition :

type error interface {
    Error() string
}

Nous pouvons générer des messages d'erreur en implémentant le type d'interface d'erreur dans le codage.

Les fonctions renvoient généralement des informations d'erreur dans la valeur de retour finale. Utilisez error.New pour renvoyer un message d'erreur :

func Sqrt(f float64) (float64, error) {
    if f < 0 {
        return 0, errors.New("math: square root of negative number")
    }
    // 实现
}

Dans l'exemple suivant, nous passons un nombre négatif lors de l'appel de Sqrt, puis obtenons un objet d'erreur non nul et comparons cet objet avec nil Comparison, le le résultat est vrai, donc fmt.Println (le package fmt appellera la méthode Error lors du traitement des erreurs) est appelé pour afficher l'erreur, veuillez consulter l'exemple de code appelé ci-dessous :

result, err:= Sqrt(-1)

if err != nil {
   fmt.Println(err)
}

Instance

package main

import (
	"fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
	dividee int
	divider int
}

// 实现 	`error` 接口
func (de *DivideError) Error() string {
	strFormat := `
	Cannot proceed, the divider is zero.
	dividee: %d
	divider: 0
`
	return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
	if varDivider == 0 {
		dData := DivideError{
			dividee: varDividee,
			divider: varDivider,
		}
		errorMsg = dData.Error()
		return
	} else {
		return varDividee / varDivider, ""
	}

}

func main() {

	// 正常情况
	if result, errorMsg := Divide(100, 10); errorMsg == "" {
		fmt.Println("100/10 = ", result)
	}
	// 当被除数为零的时候会返回错误信息
	if _, errorMsg := Divide(100, 0); errorMsg != "" {
		fmt.Println("errorMsg is: ", errorMsg)
	}

}

Exécutez le programme ci-dessus, le résultat de sortie est :

100/10 =  10
errorMsg is:  
	Cannot proceed, the divider is zero.
	dividee: 100
	divider: 0