捕捉三方包里的panic的正确姿势是什么

1. 运行环境

go version go1.18.1 darwin/amd64

2. 问题描述?

在使用某些三方包时,三方包里的某些方法会panic,会阻断自己程序的运行,由于go没有异常,正确捕捉三方包的panic姿势是什么?

比如三方包github.com/aliyun/aliyun-mns-go-sdk

封装方法如下:

func newClient(endpoint, access_id, secret string) (ali_mns.MNSClient, error) {
   defer func() {
      log.Fatalln(recover())
   }()

   return ali_mns.NewAliMNSClient(endpoint, access_id, secret), nil
}

由于NewAliMNSClient会panic,我该怎么实现这个方法呢?无论如何,都会返回client或者一个error

讨论数量: 9

捕捉的意义在什么?中断、重试、打印log; 看场景来,除了重试,需要要new 里捕捉,感觉直接在接口入口做统一异常处理。 当然整个go生态还没有错误处理的最佳实践,看个人喜欢了

1年前 评论
AB (作者) 1年前
cevin (楼主) 1年前

三方包一般 check error 就行了 三方包的 panic 基本都是使用姿势不正确

1年前 评论
cevin (楼主) 1年前

看看这个

package main

import "fmt"

func checkpanic() (d string) {
    defer func() {
        r := recover()
        if  r != nil {
            d = "error"
        }
    }()

    b := 0
    a := 10 / b
    fmt.Println("aaa", a)
    return "ok"
}

func main() {
    a := checkpanic()

    fmt.Println(a)
}
1年前 评论
ab0029 (作者) 1年前
cevin (楼主) 1年前

利用闭包封装一个执行的方法

func wrapFunc(f func()) (res func()) {
    res = func() {
        defer func() {
            if r := recover(); r != nil {
                log.Error("xxxxx")
            }
        }()
        f()
    }
    return
}

然后外部去执行下

wrapFunc(func() {
       // TODO有可能异常的代码
      balabala()
})()
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!