go语言---panic与recover

go语言中的panic和recover
  1. panic类似于其他编程语言中的throw或者raise,用于抛出异常;
  2. 当执行到panic后终止执行剩余代码,并打印错误堆栈信息;
  3. panic并不是像os.Exit(0)一样立即停止程序的运行,panic如果有defer还是会被执行的;
  4. recover用于处理panic,一是返回panic的信息,二是恢复panic的状态;
  5. recover只能恢复当前函数级别或者当前函数调用中的panic,恢复后调用当前级别函数结束,但是调用此函数的函数可以继续执行;
  6. panic会一直向上传递,如果没有recover()则表示程序终止,如果遇到了recover(),那么recover()所在级别函数在外界看来是没有出现panic的,这时候panic就不会继续向上传递;(类似于JavaScript的事件冒泡)

package main

import "fmt"

func main() {
   //testPanic1()
   //testPanic2()

   fmt.Println("测试开始")
   testRecover1()
   fmt.Println("测试结束")
   /*
   测试开始
   testRecover1上半部分
   testRecover2上半部分
   testRecover3上半部分
   testRecover4上半部分
   在testRecover2()中进行了恢复recover()
   testRecover1下半部分
   测试结束
    */

}

func testPanic1() {
   fmt.Println("1")
   fmt.Println("2")
   panic("您的电脑太垃圾了,无法继续执行,不信你看下面一行就不会执行!")
   fmt.Println("3")
}

func testPanic2() {

   // 即使有panic抛出异常,defer还是会被执行
   defer func() {
   	fmt.Println("defer中的内容")
   }()
   fmt.Println("1")
   fmt.Println("2")
   panic("您的电脑太垃圾了,无法继续执行,不信你看下面一行就不会执行!")
   fmt.Println("3")
}


func testRecover1(){
   fmt.Println("testRecover1上半部分")
   // 调用testRecover2()
   testRecover2()
   fmt.Println("testRecover1下半部分")
}

func testRecover2(){
   defer func() {
   	fmt.Println("在testRecover2()中进行了恢复recover()")
   	recover()  // 此处进行了恢复
   }()

   fmt.Println("testRecover2上半部分")
   // testRecover2()函数又调用了testRecover3()
   testRecover3()  // 由于panic会一直向上传递,所以这里"testRecover2下半部分"就被终止了,去执行defer中的内容
   fmt.Println("testRecover2下半部分")
}

func testRecover3(){
   fmt.Println("testRecover3上半部分")
   testRecover4()
   fmt.Println("testRecover3下半部分")
}

func testRecover4(){
   fmt.Println("testRecover4上半部分")
   panic("在testRecover4()中出现了panic")
   fmt.Println("testRecover4下半部分")
}

/*
上面这里例子中,1调用2,2调用3,3调用4,4里面出现了panic,会传到3调用4的位置,3里面没有进行recover()恢复,
所以继续传递到2调用3的位置,在2调用3的后面代码也不会执行,转而执行defer的内容,defer里面对panic进行了恢复,
所以1在调用2的时候,并不知道后面的调用中发生了panic;	(可以理解为JavaScript中的事件冒泡)
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值