1 Go的异常处理机制的引入
go的异常是一个interface类型
type error interface { Error() string } 复制代码
并且是可输出的
func methodA() { var err error fmt.Println(err) } func main() { methodA() } 复制代码
网络异常,图片无法展示
|
但是我们一般用panic函数进行捕获
func methodA() { var err error fmt.Println(err) panic(err) fmt.Println(err) } func main() { methodA() } 复制代码
网络异常,图片无法展示
|
这样的做法就会导致一个问题,那就是程序崩溃,不能向下进行继续的处理和异常的返回,因此我们必须有一个良好的异常处理机制进行对error类型的合理输出和处理。
由此,我们引入了defer+panic+recover进行Go程序异常处理
2 defer用法
defer函数类似于一个栈,常用于对流操作的close操作,具体演示下就知道了:
func def() { a := func() { fmt.Println("A") } b := func() { fmt.Println("B") } c := func() { fmt.Println("C") } defer c() defer b() defer a() } func main() { def() } 复制代码
执行结果:
网络异常,图片无法展示
|
3 panic和recover用法
为什么将这两个函数放在一起说呢,因为他们两个就相当于Java中的throw和try{...}catch{...}
联合进行异常的捕获和处理,示例:
func a() { defer func() { r := recover() fmt.Println("panic recover", r) }() panic(1) } func main() { defer func() { r := recover() fmt.Println("main recover", r) }() a() fmt.Println("main") def() } 复制代码
网络异常,图片无法展示
|
4 总结
- defer:异常时函数结束返回
- panic:自定义抛出异常
- recover:获取并输出异常