目录
在实际开发中透明处理与行为特征策略比较常用
一、透明处理
func main() {
err := do()
if err != nil {
fmt.Printf("find a error: %v", err)
}
}
func do() error {
return fmt.Errorf("this is error is id= %d", 1)
}
二、哨兵策略
相当于在设置了一个ErrorNotFound,当方法因为报错的时候则直接抛出该错误,明确定义哪些错误需要处理,哪些错误不需要处理
var ErrorNotFound = errors.New("not found")
func main() {
id, err := do(1)
if err != nil && err != ErrorNotFound {
fmt.Printf("find a error: %v", err)
}
if id == 0 {
//todo
}
fmt.Println(id)
}
func do(id int) (int, error) {
if id == 1 {
return id, ErrorNotFound
}
return 0, nil
}
三、自定义策略
使用结构体自定义错误包含code与msg,在执行方法中触发条件后进行错误code与msg赋值,在通过类型转换打印出错误和错误code
type MyError struct {
Code int
Msg string
}
func (e *MyError) Error() string {
return e.Msg
}
func main() {
var err error
data, err := do(1)
if err != nil {
fmt.Println(err.(*MyError).Msg)
fmt.Println(err.(*MyError).Code)
}
fmt.Println(data)
}
func do(id int) (int, error) {
if id == 1 {
return 0, &MyError{
Code: 1001,
Msg: "id is 1",
}
}
return 1, nil
}
四、行为特征策略
根据错误的类型来进行分组,每种特征来进行不同报错
type MyError struct {
Code int
Msg string
}
type NetError interface {
error
IsLink()
IsAddress()
}
func (m Link) Error() string {
return "my error"
}
func (m Link) IsLink() bool {
return true
}
func (m Link) IsAddress() bool {
return false
}
type Link struct {
}
func find(id int) (int, error) {
if id == 1 {
return 0, &Link{}
}
return id, nil
}
func main() {
var err error
data, err := find(1)
if err != nil {
//这里的意思是是否可以被转化为Link错误类型,可以判断地址与连接
if err, ok := err.(*Link); ok && err.IsAddress() && err.IsLink() {
fmt.Println("重试")
} else {
fmt.Println(err.Error())
}
}
if data == 0 {
data = 1
}
}