首页 > 其他 > 详细

Golang中recover捕获panic异常的一个坑

时间:2021-03-11 17:30:27      阅读:21      评论:0      收藏:0      [点我收藏+]

说明

  最近写代码遇到recover不能捕获panic的坑,错误代码如下:

package test1

import (
    "fmt"
    "testing"
)

func rec1() {
    err :=  recover()
    if err != nil{
        fmt.Println("err: ", err)
    }
}

func TestRecover(t *testing.T) {

    // 错误的捕获方式
    defer func (){
        fmt.Println("做一些其他业务逻辑的处理......")
        rec1()
    }()

    panic("TestRecover raises error!")
}

  运行完结果程序崩溃了。

  查了一些资料,recover()让程序恢复,必须在延迟函数中执行。换言之,recover()仅在延迟函数中有效。

  但是像上面这样将recover函数放在一个延迟的匿名函数中就不行。

  试着换一种方式执行问题就解决了:

package test1

import (
    "fmt"
    "testing"
)

func rec1() {
    err :=  recover()
    if err != nil{
        fmt.Println("err: ", err)
    }
}

func TestRecover(t *testing.T) {

    // 正确的捕获方式
    defer rec1()

    panic("TestRecover raises error!")
}

  上面这种捕获方式是可以的。

  关于Golang中defer、panic与recover相关说明的参考:https://huoyingwhw.com/golangGuide/%E5%9F%BA%E7%A1%80/4/#82-defer

 

Golang中recover捕获panic异常的一个坑

原文:https://www.cnblogs.com/paulwhw/p/14519106.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!