Golang Go语言中苦于没有异常,怎么优雅的捕捉三方包里的 panic

发布于 1周前 作者 yibo5220 来自 Go语言

比如有个三方包

package third

func X() { panic(“error”) }

然后我调用

package main

import third

func main() { callX() }

func callX() error { //thrid.X() 这里会 panic ,怎么拿到当做 error 返回 }


Golang Go语言中苦于没有异常,怎么优雅的捕捉三方包里的 panic

更多关于Golang Go语言中苦于没有异常,怎么优雅的捕捉三方包里的 panic的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

18 回复

更多关于Golang Go语言中苦于没有异常,怎么优雅的捕捉三方包里的 panic的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以看看 gin 框架是怎么捕获的~




recover 只能在 defer 里,但是 defer 又没有返回值,怎么能在 callX 方法里把 panic 信息当做 error 返回呢?

再包装一层函数啊。。。

先定义一个 err ,再进行 defer func 里面 recover ,如果有 panic 就赋值到 err 上去,然后函数 return 就会带上你的 err 了

panic 的条件你在外围先判断一次不就完了…






一定要

go<br>func call() (err error) {<br><br> defer func() {<br> if r := recover(); r != nil {<br> err = errors.New(fmt.Sprint(r))<br> }<br> }()<br><br> err = errors.New("33")<br><br> panic(111)<br><br> return<br>}<br>

有没有什么语法糖可以 defer xx() 就能实现的,或者有什么全局的『拦截器』之类的吗?



感觉还不一样。gin 是一次请求中的所有『异常』全部都在某一个点进行『捕获』。但是需要的是在某个特定的业务逻辑中需要捕获某个三方包的异常,如果这个三方包异常了,我要做一些处理,然后业务逻辑继续。

打个比方说,cli 场景下,进行视频转码,转码失败了,业务还继续,标记转码结果为 fail

lo.Try

不过要 1.18

go<br>import "<a target="_blank" href="http://github.com/sohaha/zlsgo/zerror" rel="nofollow noopener">github.com/sohaha/zlsgo/zerror</a>"<br><br>err := zerror.TryCatch(func() error {<br><br> // code<br><br> return nil<br>})<br><br>// 如果 TryCatch 内返回了 error 或触发了 panic<br>if err != nil{<br> // ..<br>}<br><br>

defer xx(&err) 传指针。

可是只能返回 error ,如果没发生 Panic 的时候,咋获取正确的返回值咧

uber 好像有个工具,使用 ast 自动加上,需要用 go generate

在Go语言中,确实没有像Java或C++那样的传统异常处理机制,但这并不意味着我们无法优雅地处理运行时错误,特别是来自第三方包的panic。Go语言提供了一种使用deferrecoverpanic的组合来处理这类情况的机制。

  1. 使用deferrecover: 在可能引发panic的函数调用周围使用defer来安排一个匿名函数,该函数内部使用recover来捕获panic。这样可以阻止程序崩溃,并允许你优雅地处理错误。

  2. 封装第三方包调用: 创建一个封装函数,用于调用可能panic的第三方包函数。在这个封装函数中,使用上述的deferrecover机制。这样,你可以集中处理错误,同时保持主程序的清晰和健壮。

  3. 记录错误信息: 当捕获到panic时,不要只是简单地忽略它。记录错误信息(例如,使用日志库),这有助于调试和后续的错误分析。

  4. 设计错误处理策略: 根据应用的具体需求,设计适当的错误处理策略。这可能包括重试机制、回退操作或向用户报告错误。

  5. 文档和注释: 对于使用了recover的代码部分,确保有足够的文档和注释,以解释为何这样做,以及它是如何工作的。这有助于维护团队理解代码的行为和意图。

通过上述方法,你可以有效地处理Go语言中的panic,即使它们来自第三方包,也能保持代码的优雅和健壮。

回到顶部