Golang Go语言中苦于没有异常,怎么优雅的捕捉三方包里的 panic
比如有个三方包
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
更多关于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
用闭包+工具函数可以达成你的需求 https://gist.github.com/icexin/fd39098dbd8e411d035573d893a46c33
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) 传指针。
lo ?
可是只能返回 error ,如果没发生 Panic 的时候,咋获取正确的返回值咧
在Go语言中,确实没有像Java或C++那样的传统异常处理机制,但这并不意味着我们无法优雅地处理运行时错误,特别是来自第三方包的panic。Go语言提供了一种使用defer
、recover
和panic
的组合来处理这类情况的机制。
-
使用
defer
和recover
: 在可能引发panic的函数调用周围使用defer
来安排一个匿名函数,该函数内部使用recover
来捕获panic。这样可以阻止程序崩溃,并允许你优雅地处理错误。 -
封装第三方包调用: 创建一个封装函数,用于调用可能panic的第三方包函数。在这个封装函数中,使用上述的
defer
和recover
机制。这样,你可以集中处理错误,同时保持主程序的清晰和健壮。 -
记录错误信息: 当捕获到panic时,不要只是简单地忽略它。记录错误信息(例如,使用日志库),这有助于调试和后续的错误分析。
-
设计错误处理策略: 根据应用的具体需求,设计适当的错误处理策略。这可能包括重试机制、回退操作或向用户报告错误。
-
文档和注释: 对于使用了
recover
的代码部分,确保有足够的文档和注释,以解释为何这样做,以及它是如何工作的。这有助于维护团队理解代码的行为和意图。
通过上述方法,你可以有效地处理Go语言中的panic,即使它们来自第三方包,也能保持代码的优雅和健壮。