C#,JAVA等语言通过try...catch...finally实现错误的捕获和处理 Go Lang异常处理的设计思想中主张
- 如果一个函数可能出现异常,那么应该把异常作为返回值,没有异常就返回 nil
- 每次调用可能出现异常的函数时,都应该主动进行检查,并做出反应,这种 if 卫述语句
defer func(){
err:=recover()
fmt.Println(err)
}()
panic("this is an error")
我自己的理解是,相当于先定义了catch的方法,后面抛出的异常都将被defer中的recover捕获,然后打印出来
那么如果是某一个被调用的函数中有异常又会发生什么?
func throwException(){
panic("this is an error")
}
func main() {
defer func(){
err:=recover()
fmt.Println(err)
}()
throwException()
// panic("this is an error")
}
throwException中的异常依旧会被捕获
上面的代码会有一个问题,就是不论有没有异常,fmt.Println(err)都会被执行,这时候需要引入nil关键字
就如它的定义,它代表着0值,这里err!=nil 说明的是err有被赋值也就是有被捕获到错误
func throwException(){
// panic("this is an error")
fmt.Println("there is no error")
}
func main() {
defer func(){
err:=recover()
if err!=nil{
fmt.Println(err)
}
}()
throwException()
// panic("this is an error")
}
func throwException(){
panic("this is an error")
// fmt.Println("there is no error")
}
func main() {
defer func(){
err:=recover()
if err!=nil{
fmt.Println(err)
}
}()
throwException()
// panic("this is an error")
}
可以对比上面两个代码的执行结果
这样try..catch的方式就被实现了
下面介绍的是推荐的写法,就是把error放在返回值中带出来,这样就可以直接获取异常,不用在外部再获取错误
func throwException() (res error) {
defer func(){
err:=recover()
if err!=nil{
fmt.Println(err)
res=fmt.Errorf("throw exception");
}
}()
panic("this is an error")
return
// fmt.Println("there is no error")
}
func main() {
defer func(){
err:=recover()
if err!=nil{
fmt.Println(err)
}
}()
res := throwException()
fmt.Println(res)
// panic("this is an error")
}
以上就是Go Lang的异常处理
标签:Lang,defer,err,fmt,Println,func,error,Go,异常
From: https://www.cnblogs.com/terry841119/p/17964461