go errors 例子

29 阅读1分钟

go处理错误只需要实现error接口即可。errors包下有很多处理错误的常用方法。本文记录几个常用的

包装错误

包装错误使用fmt.Errorf(format string, a ...interface{}) error 函数和占位符  %w :

var ErrorCritical = errors.New("critical error")
...
wrapped := fmt.Errorf("[functionName] internal error: %w", ErrorCritical)

fmt.Println(errors.Unwrap(wrapped) == ErrorCritical) // true

errors.As

As finds the first error in err's chain that matches target, and if so, sets target to that error value and returns true. Otherwise, it returns false.

errors.As方法会将错误转换为目标错误类型,如果转换出错,则返回false.

这个方法同一用于写统一错误处理函数。

package main

import (
	"errors"
	"fmt"
)
// 父错误类型
type APIStatus interface {
	error
	Status() string
}
// 子错误类型
type FailedStatus struct {
	status string
}

func(f *FailedStatus) Status() string{
	return f.status
}
func(f *FailedStatus) Error() string{
	return "err msg:" + f.status
}

// ParseError 将未知错误类型,转换为APIStatus接口类型
func ParseError(err error) {
	if status:=APIStatus(nil); errors.As(err,&status){
		fmt.Println(status.Error())
	}
}

func main(){

	f:=&FailedStatus{
		status: "failed",
	}
	ParseError(f)
}