Go异常处理-defer/panic/recover-

1.异常时不使用recover -- 异常退出

package main

import "fmt"

func main(){
	defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
		fmt.Println("c")
		//if err:=recover();err!=nil{
		//	fmt.Println(err) // 这里的err其实就是panic传入的内容,55
		//}
		fmt.Println("d")
	}()
	f()
	fmt.Printf("f -- main函数执行结束")
}

func f(){
	fmt.Println("a")
	panic("抛出异常的信息")
	fmt.Println("b")
}

//执行结果
a
c
d
panic: 抛出异常的信息

goroutine 1 [running]:
main.f()
	G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:19 +0x80
main.main()
	G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:13 +0x45

Process finished with exit code 2
复制代码

2.使用recover--exitCode==0

package main

import "fmt"

func main(){
	defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
		fmt.Println("c")
		if err:=recover();err!=nil{
			fmt.Println(err) // 这里的err其实就是panic传入的内容,55
		}
		fmt.Println("d")
	}()
	f()
	fmt.Printf("f -- main函数执行结束")
}

func f(){
	fmt.Println("a")
	panic("抛出异常的信息")
	fmt.Println("b")
}


//执行结果
a
c
抛出异常的信息
d

Process finished with exit code 0
复制代码

3. 无revocer-panic会传递导致进程终止

package main

import (
	"os"
	"fmt"
	"time"
)

func main() {
	defer fmt.Println("defer main") // will this be printed when panic?
	var user = os.Getenv("USER_")
	go func() {
        defer fmt.Println("defer caller")
        func() {
            defer func() {
                fmt.Println("defer here")
            }()

            if user == "" {
                panic("should set user env.")
            }
        }()
	}()

	time.Sleep(1 * time.Second)
	fmt.Printf("get result %d\r\n", result)
}

//执行结果
defer here
defer caller
panic: should set user env.

goroutine 18 [running]:
main.main.func1.1(0x0, 0x0)
	G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:20 +0x86
main.main.func1(0x0, 0x0)
	G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:22 +0x98
created by main.main
	G:/project/MediaCloud_live_20181023/LiveOriginService/src/LiveOriginService/test.go:12 +0xb1

Process finished with exit code 2
复制代码

4. recover--只终止异常的gouroutine try-catch

package main

import (
	"fmt"
	"os"
	"time"
)

func main() {
	defer fmt.Println("defer main") // will this be called when panic?
	var user = os.Getenv("USER_")
	go func() {
		defer func() {
			fmt.Println("defer caller")
			if err := recover(); err != nil {
				fmt.Println("recover success.")
			}
		}()
		func() {
			defer func() {
				fmt.Println("defer here")
			}()

			if user == "" {
				panic("should set user env.")
			}
			fmt.Println("after panic")
		}()
	}()

	time.Sleep(1 * time.Second)
	fmt.Printf("get result %d\r\n")
}


//执行结果
defer here
defer caller
recover success.
get result %!d(MISSING)
defer main

Process finished with exit code 0
复制代码

转载于:https://juejin.im/post/5bd95b22e51d45681e69d561

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值