Bases
La gestion des erreurs doit faire partie du projet. L'erreur dans Golang est de type interface
, comme suit :
type error interface { Error() string }
peut être traitée comme une erreur. Par conséquent, si une erreur peut survenir dans la fonction, vous pouvez renvoyer une erreur à la fin de la valeur de retour, telle que : Error()
func foo() error { // ... do something return errors.New("foo error") }
Renvoyer l'erreur directement
Renvoie l'erreur directement, similaire à directement Renvoie une erreur de type chaîne, ou un code d'erreur ou similaire. Des erreurs de type chaîne ont été mentionnées dans la section Notions de base. Le code d'erreur est équivalent au code d'erreur de la programmation Linux et C. Généralement, nous devons le définir nous-mêmes. Par exemple :package mypkg type ErrCode int const ( ERR1 = 1 ERR2 = 2 ERR3 = 3 ) func sub(a, b int) (int, ErrCode) { if b < 0 { return 0, ERR1 } else if a < b { return 0, Err2 } else if a < 0 { return 0, Err3 } return a - b }
Renvoyer un type personnalisé d'erreur
Cette méthode peut renvoyer un type personnalisé et effectuer la gestion des erreurs associée en affirmant le type personnalisé. Elle peut contenir plus d'informations ; Exemple de code :package main import ( "errors" "fmt" "runtime/debug" ) type MyError struct { Inner error // 内粗错误 Message string // 自定义错误信息 StackTrace string // 堆栈信息 Misc map[string]interface{} //其它的一些数据 } func (myError MyError) Error() string { return myError.Message } func wrapError(err error, msg string, msgArgs ...interface{}) MyError { return MyError{ Inner: err, Message: fmt.Sprintf(msg, msgArgs), StackTrace: string(debug.Stack()), Misc: make(map[string]interface{}), } } func Handle(key int) error { if key < 0 { return wrapError(errors.New("key < 0"), "This is an error test") } return nil } func main() { if err := Handle(-1); err != nil { if e, ok := err.(MyError); ok { fmt.Printf("Inner: %v, Message: %v, StackTrace: %v\n", e.Inner, e.Message, e.StackTrace) // 这里输出对应的数据 } } }
Gestion des erreurs qui masque les détails internes
Les deux méthodes ci-dessus peuvent être adaptées à certains scénarios, mais aucune ne peut résoudre le problème des éventuelles dépendances circulaires. À cette fin, nous utilisons le package pour résoudre le problème et donner un exemple de code. github.com/pkg/errors
func New(message string) error
//只附加新的信息 func WithMessage(err error, message string) error //只附加调用堆栈信息 func WithStack(err error) error //同时附加堆栈和信息 func Wrap(err error, message string) error
func Cause(err error) error { type causer interface { Cause() error } for err != nil { cause, ok := err.(causer) if !ok { break } err = cause.Cause() } return err }
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!