异常
- 不按照我们期望执行的都可以称之为异常
- 在Go语言中如何处理异常
- 一种是程序发生异常,将异常信息反馈给使用者
- 一种是程序发生异常,立即退出终止程序继续运行
创建异常信息
- Go语言中提供了两种创建异常信息的方式
-
注意点:
本质上两个方法底层的实现原理都是一样的 - 创建方式一: fmt.Errorf("提示的内容")
package main
import (
"fmt"
"errors"
)
func main() {
if res, err := div(10,5); err == nil {
fmt.Println(res)
}else {
fmt.Println(err)
}
}
//除法运算函数
func div(a,b int)(res int,err error) {
//除数不能为0
// 将异常信息反馈给使用者
if b == 0 {
err = fmt.Errorf("除数不能为零")
}else{
res = a / b
}
return
}
- 创建方式二: errors.New("提示的内容")
package main
import (
"fmt"
"errors"
)
func main() {
if res, err := div(10,5); err == nil {
fmt.Println(res)
}else {
fmt.Println(err)
}
}
//除法运算函数
func div(a,b int)(res int,err error) {
//除数不能为0
// 将异常信息反馈给使用者
if b == 0 {
err = errors.New("除数不能为零")
}else{
res = a / b
}
return
}
异常处理终止程序
- 终止程序也分为两种:
1.系统自动终止
2.我们手动终止 (企业开发不常用)
格式: panic("提示信息")
package main
import "fmt"
func main() {
/*
另一种是程序发生异常时, 立刻退出终止程序继续运行
终止程序也分为两种:
1.系统自动终止
2.我们手动终止 (企业开发不常用)
格式: panic("提示信息")
*/
res := div(10, 0)
fmt.Println(res)
}
func div(a,b int)(res int) {
if b==0 {
//我们手动终止程序运行
panic("除数不能为0")
}else {
res = a / b
}
return
}
异常终止恢复
- 程序不要随意被终止, 只要不是程序不能运行了, 就尽量让改程序继续保持运行
- 在Go语言中如果panic异常, 那么可以通过
defer和recover
来实现panic异常的捕获, 让程序继续执行
注意点:
1.defer和recover必须在panic抛出异常之前定义
2.panic异常会随着函数的调用栈向外传递
例如: A函数调用了B函数, B函数调用了C函数
如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A
也就是在B和A函数中也能捕获到这个异常
package main
import "fmt"
func main() {
/*
1.程序不要随意被终止, 只要不是程序不能运行了, 就尽量让改程序继续保持运行
2.在Go语言中如果panic异常, 那么可以通过defer和recover来实现panic异常的捕获, 让程序继续执行
注意点:
1.defer和recover必须在panic抛出异常之前定义
2.panic异常会随着函数的调用栈向外传递
例如: A函数调用了B函数, B函数调用了C函数
如果在C函数中抛出了一个panic异常, 那么这个异常会一层一层的传递到B和A
也就是在B和A函数中也能捕获到这个异常
*/
defer func() {
if err := recover(); err != nil{
fmt.Println("捕获异常",err)
}
}()
res := div(10, 0)
fmt.Println(res)
}
func div(a,b int)(res int) {
//对panic进行捕获
//defer无论所在的函数是正常结束,还是异常结束都会被执行
//recover可以捕获panic异常
//defer func() {
// if err := recover(); err != nil{
// fmt.Println("捕获异常",err)
// }
//}()
if b==0 {
//判断终止程序条件
panic("除数不能为0")
}else {
res = a / b
}
//defer和recover必须在panic抛出异常之前定义
//defer func() {
// if err := recover(); err != nil{
// fmt.Println("捕获异常",err)
// }
//}()
return
}
- 异常恢复注意点
- 同一个函数中, 多个panic异常, 只有第一个会被捕获
- 如果有异常写在defer中, 但是defer后面还有其它异常, 那么捕获到的是defer中的异常
- 如果其它异常是写在defer前面, 那么和同一个函数中, 多个panic异常, 只有第一个会被捕获
package main
import "fmt"
func main() {
/*
捕获异常注意点:
1.同一个函数中, 多个panic异常, 只有第一个会被捕获
*/
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
panic("我是异常1")
panic("我是异常2")
panic("我是异常3")
test()
}
func test() {
//如果有异常写在defer中, 但是defer后面还有其它异常, 那么捕获到的是defer中的异常
//如果其它异常是写在defer前面, 那么和同一个函数中, 多个panic异常, 只有第一个会被捕获
defer func() {
if err := recover(); err != nil{
fmt.Println(err)
}
}()
//defer func() {
// panic("我是异常1")
//}()
//panic("我是异常2")
panic("我是异常2")
panic("我是异常3")
defer func() {
panic("我是异常1")
}()
}
网友评论