公告

微信

欢迎大家私信交流

Skip to content

错误

error

error接口

go
var MoneyNotEnough = errors.New("余额不足")

func pay(money float64) error {
 if money < 10 {
  return MoneyNotEnough
 }
 return nil
 // 错误不一致 因为new
 //if money < 10 {
 // return errors.New("余额不足")
 //  return fmt.Errorf("余额不足:%f", money)
 //}
 //return nil
}

// 判断错误一致
//func main() {
// err := pay(5)
// if errors.Is(err, MoneyNotEnough) {
//  fmt.Println("两个错误一致")
// }
//}

type MyError struct {
 Msg string
}

func (e *MyError) Error() string {
 return e.Msg
}

var MoneyNotEnough1 = &MyError{Msg: "余额不足"}

func pay1(money float64) error {
 if money < 10 {
  return MoneyNotEnough1
 }
 return nil
}

//func main() {
// err := pay1(5)
// var myError *MyError
// if errors.As(err, &myError) {
//  fmt.Println("转换成功")
//  fmt.Println(myError.Error())
// } else {
//  fmt.Println("不是此error类型")
// }
//}

//func main() {
// originalErr := errors.New("原始错误")
// //%w 嵌套生成一个新的错误
// newError := fmt.Errorf("error: %w", originalErr)
// if errors.Is(newError, originalErr) {
//  fmt.Println("这两个错误相等")
// }
// //用于将一个错误对象展开,得到下一层错误对象
// originalErr1 := errors.Unwrap(newError)
// if errors.Is(originalErr, originalErr1) {
//  fmt.Println("这两个错误相等")
// }
//}

// join 的 使用
func main() {
 err1 := errors.New("err1")
 err2 := errors.New("err2")
 err := errors.Join(err1, err2)
 if errors.Is(err, err1) {
  fmt.Println("err is err1")
 }
 if errors.Is(err, err2) {
  fmt.Println("err is err2")
 }
 fmt.Println(err)
}

panic

go
func pay2(money int64) error {
 if money < 10 {
  return errors.New("钱不够")
 }
 return nil
}

//func main() {
// err := pay2(5)
// if err != nil {
//  //panic会打印详细的堆栈信息,便于定位错误
//  panic("余额不足")
// }
//}
//
//func main() {
// err := pay2(5)
// //defer 延迟调用,在return结束前运行
// defer func() {
//  //panic会被捕获
//  if err := recover(); err != nil {
//   log.Printf("panic:%+v \n", err)
//  }
// }()
// if err != nil {
//  panic("余额不足")
// }
//}

func main() {
 // 使用匿名函数 将需要保护的代码 控制在一定范围
 // 不使用匿名函数 panic后,代码不执行
 func() {
  err := pay2(5)
  defer func() {
   if err := recover(); err != nil {
    log.Printf("panic:%+v \n", err)
   }
  }()
  if err != nil {
   panic("余额不足")
  }
 }()
 fmt.Println("发生panic后 这里的代码依旧会执行")
}

上次更新于: