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