请教一下怎么优雅的处理 go 中的 err

2019-05-24 08:51:41 +08:00
 d0m2o08
go 中大部分短赋值都会有一个 xx, err :=
难道要每次都 if err != nil 么
大佬都是用什么方式处理的?

func checkErr(err error) {
if err != nil{
panic(err)
}
}

这样貌似也很低级啊
9878 次点击
所在节点    Go 编程语言
62 条回复
zeromake
2019-05-24 13:28:39 +08:00
这些返回错误搞得栈信息全丢了
liuxey
2019-05-24 14:07:35 +08:00
既然选择了 Go,那么就用 Go 的方式处理错误,Go 不是一门语法“优雅”的语言
Nugine0
2019-05-24 14:12:01 +08:00
@pmispig 问号操作符能缓解,等 async/await 稳定后写异步也能喘气了
ysc3839
2019-05-24 14:13:45 +08:00
@pmispig 但是 C 有 #define,可以弄成 CHECK_RETURN(function());
index90
2019-05-24 14:38:21 +08:00
都说 if err != nil 不好,我想问,你们认为好的是怎样的?
RubyJack
2019-05-24 15:17:48 +08:00
我从 if err != nil 中学到了很多,原来这个底层调用也可能报错
WilliamYang
2019-05-24 15:39:40 +08:00
我已经习惯,并可能喜欢上它了
Skye347
2019-05-24 15:40:05 +08:00
就 Rust 而言,只有错误没有异常,可能出错的地方统一用 Result<Item,Error>代替,不想处理直接往上抛直接打?号,不想处理显示报错直接.unwrap (),不想处理直接忽略有 if let,不想处理带默认值有 unwrap_or(),想处理直接用 match 处理部分或全部情况,再或者结合 map 等函数式风格随意组合,多种方式随意选择,还有 IDE/编译器提示。
不过 go 选择了类 c 的风格,强调简单,那也没哪个好或者不好的了。
neoblackcap
2019-05-24 16:03:29 +08:00
@Skye347 就 Result 这个设计就是吸收了多年 PL 研究成果的好东西,配合自带的各种方法,写起代码行云流水。错误能处理的就处理,不能处理就抛给 caller,还能配合编译器进行类型检查,Monad 的应用,这么好的东西有人理解不了,硬说跟 error code 一样,还能说什么。我觉得这些人用 Go 跟 C 都挺好的,记得不要忘记检查错误码就好了
skadi
2019-05-24 19:11:50 +08:00
defer
sunny352787
2019-05-24 19:23:58 +08:00
你们这帮 Java 转 Go 的肯定都喜欢 try,就是习惯
你看像我们 C++转 Go 的从来不会提这类问题~
Em5O7B1JGfjQnBry
2019-05-24 20:00:47 +08:00
这都能讨论这么多,我的天,不就是个 Monad 随手就能解决的问题么,真是尴尬
petelin
2019-05-24 20:33:15 +08:00
你们这些都不看错误怎么处理的人 能写出什么严谨的程序
zhuangzhuang1988
2019-05-24 20:37:49 +08:00
换个语言
derek80
2019-05-24 20:44:29 +08:00
@SurfaceView pascal 也是放后面啊,还有 var
Tyanboot
2019-05-25 01:08:07 +08:00
@VDimos Rust 的 Result 和 Option 不知道比 go 的 err 高到哪里去了🙃。
python
2019-05-25 10:51:11 +08:00
习惯成自然
skiy
2019-05-25 11:14:58 +08:00
slice[0:100]
当 100 超出了 len(slice),就报错了,特别烦这个,有解决方案么
neoblackcap
2019-05-25 12:57:48 +08:00
@skiy 你为什么需要访问越界的元素?
Karblue
2019-05-25 13:19:37 +08:00
吐槽 err 的几乎是喜欢把所有都错误 try catch 的人,虽然确实很啰嗦,但是这个特性写过 c/c++的人就知道,还是比较方便的.
更严谨,也更啰嗦,至少更能了解程序内部哪个地方出错了

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

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

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

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

© 2021 V2EX