Go语言-panic、recover和error

在Go语言中,一般的错误处理,通过error就够了,但是对于严重的错误,需要终止进程的操作,需要用到panic,与panic相关的还有recover,recover用来截获panic的错误信息。归纳如下:

error:处理一般性的错误

panic:处理需要终止程序的错误,并且会将堆栈里面的数据信息dump出来

recover:截获panic的异常错误信息,并能执行处理,使程序跳过panic继续执行而不会直接崩溃

 

func main()  {
    testPanic(-10)
    fmt.Println("finish success")
}

// 测试panic
func testPanic(param int) {

    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("截获到panic异常",err)
        }
    }()

    if param < 0 {
        panic("参数不能小于0")
    }
    fmt.Println("input param:",param)
}

执行结果:

截获到panic异常 参数不能小于0
finish success

可以看到通过panic抛出的错误被recover截获到了,并进行了处理。

 

需要注意的是:

1、recover必须结合panic和defer使用

2、recover必须和panic处于同一个协程里面

func main()  {

    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("截获到panic异常",err)
        }
    }()
    go testPanic(-10)
    fmt.Println("finish success")
}

// 测试panic
func testPanic(param int) {

    if param < 0 {
        panic("参数不能小于0")
    }
    fmt.Println("input param:",param)
}

执行结果:

finish success

可以看到recover在主协程中,而当panic发生在子协程中的时候,recover并不能截获到panic的异常信息。

 

posted on 2022-04-14 19:33  funnyboy0128  阅读(215)  评论(0编辑  收藏  举报

导航