比如有个三方包
package third
func X() {
    panic("error")
}
然后我调用
package main
import third
func main() {
    callX()
}
func callX() error {
    //thrid.X() 这里会 panic ,怎么拿到当做 error 返回
}
|  |      1jybox      2022-05-05 18:30:56 +08:00 | 
|  |      2undeflife      2022-05-05 19:00:51 +08:00 | 
|      3bugfan      2022-05-05 22:23:32 +08:00 via iPhone 可以看看 gin 框架是怎么捕获的~ | 
|  |      4dzdh OP | 
|      6Akkuman      2022-05-05 22:37:06 +08:00 via Android @dzdh 先定义一个 err ,再进行 defer func 里面 recover ,如果有 panic 就赋值到 err 上去,然后函数 return 就会带上你的 err 了 | 
|      7tairan2006      2022-05-05 22:43:03 +08:00 via Android panic 的条件你在外围先判断一次不就完了… | 
|  |      8dzdh OP @phpfpm  @Akkuman @tairan2006 一定要 ```go func call() (err error) { defer func() { if r := recover(); r != nil { err = errors.New(fmt.Sprint(r)) } }() err = errors.New("33") panic(111) return } ``` 有没有什么语法糖可以 `defer xx()` 就能实现的,或者有什么全局的『拦截器』之类的吗? | 
|  |      9dzdh OP @bugfan  感觉还不一样。gin 是一次请求中的所有『异常』全部都在某一个点进行『捕获』。但是需要的是在某个特定的业务逻辑中需要捕获某个三方包的异常,如果这个三方包异常了,我要做一些处理,然后业务逻辑继续。 打个比方说,cli 场景下,进行视频转码,转码失败了,业务还继续,标记转码结果为 fail | 
|      10icexin      2022-05-05 23:27:36 +08:00 用闭包+工具函数可以达成你的需求 https://gist.github.com/icexin/fd39098dbd8e411d035573d893a46c33 | 
|      11tairan2006      2022-05-05 23:35:33 +08:00 via Android lo.Try 不过要 1.18 | 
|      12soseek      2022-05-06 00:59:37 +08:00 via Android ```go import "github.com/sohaha/zlsgo/zerror" err := zerror.TryCatch(func() error { // code return nil }) // 如果 TryCatch 内返回了 error 或触发了 panic if err != nil{ // .. } ``` | 
|      13joesonw      2022-05-06 09:18:41 +08:00 via iPhone defer xx(&err) 传指针。 | 
|  |      14dzdh OP @tairan2006  lo ? | 
|  |      15Juszoe      2022-05-06 10:40:45 +08:00 lo 是泛型工具库 https://github.com/samber/lo |