GO-如何从异常中恢复(异常的抛出和捕获)
1.抛出异常
当程序出现错误时,可以通过抛出异常的方式,中断程序的执行,并指明原因。
go通过panic将异常抛出
package main
import (
"errors"
)
func main() {
err := errors.New("this is an error")
panic(err)
}
打印结果:
panic: this is an error
goroutine 1 [running]:
main.main()
D:/Code/HelloGo/src/error/myRecover.go:63 +0x65
panic的参数是空接口—interface{},所以panic能够接收任何类型的参数。
上述例子时error类型,下面为string类型
package main
func main() {
panic("error")
}
//打印结果
//panic: error
2.捕获异常
go中通过recover搭配defer的方式对异常进行捕获。
package main
import "fmt"
func catchError() {
//recover()捕获异常
errorInfo := recover()
fmt.Println(errorInfo)
}
func main() {
//确保异常抛出后,任能执行catchError()
defer catchError()
panic("throw error")
}
运行结果
throw error
当panic抛出异常后,执行catchError()方法。
catError()方法中,采用recover()方法,对异常进行捕获,并获取其信息,最总打印输出。
注意:
- 采用 defer recover() 的方式,异常捕获会失效。必须将recover包裹在一个方法中。
- catchError()中没有recover()方法的化,执行完catchError()方法后,异常依旧会抛出。
3 调用抛出异常类型的方法
当我们想调用抛出对象上方法时,需要采用类型转换。将空接口转换成具体对象。
package main
import (
"errors"
"fmt"
)
func catchError() {
//捕获异常
errorInfo := recover()
//将空接口转换成error类型
err,ok := errorInfo.(error)
if ok {
//转换成功,调用error类型的Error()方法
fmt.Println(err.Error())
}else{
//转换失败,将异常再次抛出,等待外部处理
panic(errorInfo)
}
}
func main() {
defer catchError()
err := errors.New("throw error")
//抛出error类型的异常
panic(err)
}
打印结果
throw error
本文介绍了Go语言中如何处理异常。首先,详细阐述了如何通过`panic`抛出异常,它接受任意类型的参数。其次,讲解了使用`defer`和`recover`组合来捕获并处理异常,强调了`defer recover()`的正确使用方式。最后,讨论了在捕获异常后,如何通过类型转换调用异常对象的方法。
186

被折叠的 条评论
为什么被折叠?



