6、go的异常处理
先看正常的出现异常情况
func main() {
test()
// 上面方法执行有报错,所以下面代码不会执行
fmt.Println("上面方法执行成功...")
fmt.Println("正常执行下面代码逻辑...")
}
func test() {
num1 := 10
num2 := 0 // 除数不能为0,就会报错
result := num1 / num2
fmt.Println(result)
}
上面代码肯定会报错
使用defer + recover()函数的机制处理
func main() {
test()
// 上面方法执行有报错,所以下面代码不会执行
fmt.Println("上面方法执行成功...")
fmt.Println("正常执行下面代码逻辑...")
}
func test() {
defer func() {
// 调用recover内置函数,捕获错误
err := recover()
// 如果美欧捕获异常,返回值为零:nil
if err != nil {
fmt.Println("错误已经捕获")
fmt.Println("err是",err)
}
}()
num1 := 10
num2 := 0 // 除数不能为0,就会报错
result := num1 / num2
fmt.Println(result)
}
正常打印:
自定义错误
func main() {
err := test()
if err != nil {
fmt.Println("自定义错误: ", err)
panic(err) // panic函数阻止了程序继续允许,直接停止了
}
// 上面方法执行有报错,所以下面代码不会执行
fmt.Println("上面方法执行成功...")
fmt.Println("正常执行下面代码逻辑...")
}
func test() (err error) {
num1 := 10
num2 := 0 // 除数不能为0,就会报错
if num2 == 0 {
// 抛出自定义异常
return errors.New("除数不能为0哦!!!")
} else {
result := num1 / num2
fmt.Println(result)
return nil
}
}
打印:
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙