Go语言异常处理
2018-09-29 本文已影响0人
AuglyXu
异常处理
- 异常处理分为两种
- 提示用户错误信息但不终止程序
- 直接中断程序
提示错误信息(不终止程序)
方法一
- fmt.Errorf("提示的内容")
- 函数返回字符串,返回的字符串为错误的提示信息
方法二
- errors.New("提示的内容")
- 函数返回字符串,返回的字符串为错误的提示信息
if res, err := div(10, 0); err == nil {
fmt.Println(res)
}else{
fmt.Println(err)
}
func div(a, b int) (res int, err error) {
if b == 0 {
// 创建一个异常信息
//fmt.Println(fmt.Errorf("除数不能为0"))
//err = fmt.Errorf("除数不能为0")
err = errors.New("除数不能为0")
}else{
res = a / b
}
return
}
中断程序
-
中断程序也分两种,第一种是系统中断,不需要我们操作
-
第二种为手动中断程序(企业开发不常用)
- 格式:panic("提示信息")
func div(a, b int) (res int) {
if b == 0 {
// 手动终止程序
panic("除数不能为0")
}else{
res = a / b
}
return
}
异常恢复
-
程序不要随意被终止, 只要不是程序不能运行了, 就尽量让改程序继续保持运行
-
在Go语言中如果panic异常, 那么可以通过defer和recover来实现panic异常的捕获, 让程序继续执行
-
格式:recover()
- 如果捕获到返回err错误
-
注意点:
1.defer和recover必须在panic抛出异常之前定义
2.panic异常会随着函数的调用栈向外传递
例如: A函数调用了B函数, B函数调用了C函数,如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A,也就是在B和A函数中也能捕获到这个异常 -
panic注意点:
- panic后面的程序不会被执行,所以在异常恢复的时候如果defer和recover写在了panic后面则无效
异常恢复注意点
- 注意点
1.同一个函数中有多个终止异常, 那么只有第一个会被捕获
2.如果defer中也有终止异常,但是defer前面也有终止异常, 那么只会捕获到defer前面的那个终止异常
3.如果defer中也有终止异常,但是defer后面也有终止异常,那么只会捕获到defer中的那个终止异常
以下代码会打印异常B
defer func() {
if err := recover(); err != nil{
fmt.Println(err)
}
}()
//panic("异常A")
defer func() {
panic("异常B")
}()
panic("异常A")