写了个 err warp,或许可以少写点 if err

2023-04-28 15:43:39 +08:00
 voidmnwzp

一般情况下需要串行化的执行下去,如果其中一步遇到错误就会退出,但这样调用完个每个方法都要写个 err

如果将执行的方法作为一个闭包封装进去,就可以省去一大堆 if err:

这样如果执行的过程中遇到了错误,也会跳过执行, 最后调用 wrap.Error()返回错误 e.g.:

外层变量 a,b,c,d 可以通过闭包来赋值

4090 次点击
所在节点    Go 编程语言
47 条回复
totoro52
2023-04-28 18:27:23 +08:00
与其叫少写,不如叫遮羞布。。。
lesismal
2023-04-28 18:27:44 +08:00
@777777 #6 你不是一个人!喜欢 if err 的人多着呢,只是我都懒得喷那些喷 if err 的人罢了
voidmnwzp
2023-04-28 18:36:28 +08:00
elechi
2023-04-28 18:46:20 +08:00
好像有个 multierr 包
RedisMasterNode
2023-04-28 20:35:29 +08:00
觉得 if err != nil 让别人更容易搞懂程序每一步的错误想怎么处理...不明白为何要把它 warp 或者简化起来
ck65
2023-04-28 20:39:36 +08:00
字面意义上的过度封装。
flyqie
2023-04-28 21:02:47 +08:00
hsfzxjy
2023-04-28 21:05:26 +08:00
虽然但是,为什么是 warp 不是 wrap
cmdOptionKana
2023-04-28 21:14:19 +08:00
我也有做类似的处理

// WrapErrors 把多个错误合并为一个错误.
func WrapErrors(allErrors ...error) (wrapped error) {
for _, err := range allErrors {
if err != nil {
if wrapped == nil {
wrapped = err
} else {
wrapped = fmt.Errorf("%w | %w", wrapped, err)
}
}
}
return
}
cmdOptionKana
2023-04-28 21:16:46 +08:00
我这个使用时应该更直白简洁, 例如

a, err1 := func1()
b, err2 := func2()

if err := WrapErrors(err1, err2); err != nil { return err }
zbinlin
2023-04-28 21:40:33 +08:00
这时候不应该换语言了吗 🐶
SenLief
2023-04-28 22:06:19 +08:00
if err 都没有,那还是 go 了吗?
piaodazhu
2023-04-28 22:26:57 +08:00
想到个这个,大家看这样有什么问题不:
1. 定义一个函数 func checkError(err error),函数内检查如果 err!=nil 就 panic(err)
2. 在你业务函数开头写一个 defer func()内部做 recover()
3. 在你业务函数中每次调用后,调用 checkError(err)

这样就不用写那么多`if err != nil { ... `了吧,panic 被捕获时,也能知道发生 err 的是啥。
yazinnnn
2023-04-28 23:02:45 +08:00
是我第 2887 喜欢的 go boy 重新发明 monad 时间🤗
Kisesy
2023-04-28 23:08:13 +08:00
@cmdOptionKana 楼主要的效果是,有函数有错误,下面的代码就不执行了,你这个即使 func1 出错了,func2 还是会执行
voidmnwzp
2023-04-28 23:31:36 +08:00
@piaodazhu 可以是可以 这样就是类似 java 的 try/catch 但是,风险太大 万一哪个地方漏写了 recover 那不是单个 goruntine down 了 是个整个进程都得挂 一不小心就是线上重大事故了属于
voidmnwzp
2023-04-29 00:00:54 +08:00
@hsfzxjy 因为我拼错了。z
yrj
2023-04-29 05:45:16 +08:00
@voidmnwzp 没事,我也经常拼错🤣
Nasei
2023-04-29 09:21:20 +08:00
@magicdawn 如果不用库,rust 的 ? 在 Err 类型不一样的时候感觉很难受....
magicdawn
2023-04-29 17:21:49 +08:00
@Nasei

有编译器语法糖啊, Result<>? / Option<>? 会自动 check 是否是 err / 是否有值
不用库啊, go 可以学一下.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/936244

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX