乐趣区

关于go:go使用recover来捕捉panic防止程序崩溃

一、在协程中的 panic(),导致整个程序解体

func TestPanic(t *testing.T) {t.Log("1")
    go func() {panic("panic")
    }()
    time.Sleep(time.Second * 1) // 加一下,避免 多个协程 (panic 协程还没走到,主协程就完结了)
    t.Log("2")
}

输入:

1
panic: panic

goroutine 7 [running]:
github.com/hisheng/dataStructure/panic.TestPanic.func1()
    /Users/zhanghaisheng/study/dataStructure/panic/panic_test.go:16 +0x39
created by github.com/hisheng/dataStructure/panic.TestPanic
    /Users/zhanghaisheng/study/dataStructure/panic/panic_test.go:15 +0x85

咱们能够看到,子协程的 panic,间接导致了,主协程也蹦了,没法执行上来。

二、go 应用 recover() 来捕获 panic(),避免程序解体

func TestRecover(t *testing.T) {t.Log("1")
    go func() {defer func() {recover()
        }()
        panic("panic")
    }()
    time.Sleep(time.Second * 1) // 加一下,避免 多个协程 (panic 协程还没走到,主协程就完结了)
    t.Log("2")
}

输入:

1
2

三、go 应用 recover() 来做一些逻辑解决

recover() 有返回值,咱们能够用 recover() != nil 来做一些解决

// 当 panic 的时候写入到日志外面
func TestRecover2(t *testing.T) {t.Log("1")
    go func() {defer func() {r := recover()
            if r != nil {// 写入日志}
        }()
        panic("panic")
    }()
    time.Sleep(time.Second * 1) // 加一下,避免 多个协程 (panic 协程还没走到,主协程就完结了)
    t.Log("2")
}
退出移动版