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

336 阅读2分钟

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