错误
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后 这里的代码依旧会执行")
}