Go1 如何实用地错误处理(Error Handling and Go 1)

2018-09-01 09:43:52 +08:00
 freestyle

4 月 GopherChina 大会上 Marcel 首次公开了Go2 的错误处理改进的初步想法, 最近官方发布了 Go2 草案, 要改善错误处理, 给了多种社区和官方的设计方案, GoCN 分享的每日新闻中讨论 Go 语言的错误处理文章也多了起来:
1. handling-more-than-just-errors-in-go
2. error-handling-go
3. exploring-error-handling ...

我也来分享下我对 Go 错误处理的理解和实践经验, 实用为主, 目标是看到错误日志能快速定位问题, 减轻错误处理的负担, 使用效果不错. 代码是去年写的, 博客是 7 月写的...
文章: https://hanjm.github.io/2018/07/08/Go%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86(Error%20handling%20and%20Go%201)/

包: https://github.com/hanjm/errors

3110 次点击
所在节点    Go 编程语言
9 条回复
janxin
2018-09-01 11:26:59 +08:00
lz 你们在生产上用 nats 了?
freestyle
2018-09-01 12:24:39 +08:00
@janxin 用了,用于日志等负载大容忍丢失的场景
janxin
2018-09-01 12:58:08 +08:00
@freestyle 会丢?主要是想了解一下 streaming server 吞吐能力跟可靠性
freestyle
2018-09-01 15:18:59 +08:00
@janxin nats 是网络和内存 buffer, 不落盘, 消费者处理不过来就丢, topic 没有消费者消费就丢. nats streaming 则是累积到服务端设置最大消息数量 /大小就丢. 吞吐很好, 实际应用中单机达到上限了, 可以拆分 topic 或者集群, nats 的通配符订阅很赞 具体的性能可以用 bench 在你的机器上分别测一下 https://github.com/nats-io/go-nats/blob/master/examples/nats-bench.go https://github.com/nats-io/go-nats-streaming/blob/master/examples/stan-bench/main.go
azzwacb9001
2018-09-01 17:53:03 +08:00
感谢分享!想跟楼主交流一个事情,我看到 Go 的 code style 建议里说,不要在错误返回的 else 块里做“正常情况下的功能代码”

e.g.

```
if err != nil {
xxx
} else {
// 如果没有报错的情况下要执行的代码
}
```

而是应该把 else 中的代码给抽出来,直接放在外边。
为什么要这么做呢?道理是什么呢?
janxin
2018-09-01 18:26:36 +08:00
@freestyle 集群你们使用下来有什么坑吗
miniliuke
2018-09-01 18:33:49 +08:00
@azzwacb9001 我感觉是这样一整个正常流程走下来很流畅,另外如果有几十个错误这样嵌套起来这代码没法写也没法看 ̄  ̄)σ
freestyle
2018-09-01 19:21:00 +08:00
@azzwacb9001 及时 return, 免得面条式代码, 提高可读性
freestyle
2018-09-01 19:25:56 +08:00
@janxin 1. 客户端设置 client_id 的坑. 2. Unsubscribe 和 Close 的坑: Unsubscribe 会在 server 端移除该 subject 的持久化, Close 不会. 集群方面的坑暂时没遇到, 这个 readme 一定要看 https://github.com/nats-io/nats-streaming-server/blob/master/README.md

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

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

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

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

© 2021 V2EX