比如有个三方包
package third
func X() {
panic("error")
}
然后我调用
package main
import third
func main() {
callX()
}
func callX() error {
//thrid.X() 这里会 panic ,怎么拿到当做 error 返回
}
1
jybox 2022-05-05 18:30:56 +08:00
|
2
undeflife 2022-05-05 19:00:51 +08:00
|
3
bugfan 2022-05-05 22:23:32 +08:00 via iPhone
可以看看 gin 框架是怎么捕获的~
|
4
dzdh OP |
6
Akkuman 2022-05-05 22:37:06 +08:00 via Android
@dzdh 先定义一个 err ,再进行 defer func 里面 recover ,如果有 panic 就赋值到 err 上去,然后函数 return 就会带上你的 err 了
|
7
tairan2006 2022-05-05 22:43:03 +08:00 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-05-05 23:27:36 +08:00
用闭包+工具函数可以达成你的需求 https://gist.github.com/icexin/fd39098dbd8e411d035573d893a46c33
|
11
tairan2006 2022-05-05 23:35:33 +08:00 via Android
lo.Try
不过要 1.18 |
12
soseek 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{ // .. } ``` |
13
joesonw 2022-05-06 09:18:41 +08:00 via iPhone
defer xx(&err) 传指针。
|
14
dzdh OP @tairan2006 lo ?
|
15
Juszoe 2022-05-06 10:40:45 +08:00
lo 是泛型工具库 https://github.com/samber/lo
|