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

发布于 1周前 作者 sinazl 来自 Go语言

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


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

更多关于Golang Go语言1 如何实用地错误处理(Error Handling and Go 1)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

lz 你们在生产上用 nats 了?

更多关于Golang Go语言1 如何实用地错误处理(Error Handling and Go 1)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


用了,用于日志等负载大容忍丢失的场景

会丢?主要是想了解一下 streaming server 吞吐能力跟可靠性

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

感谢分享!想跟楼主交流一个事情,我看到 Go 的 code style 建议里说,不要在错误返回的 else 块里做“正常情况下的功能代码”

e.g.

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

而是应该把 else 中的代码给抽出来,直接放在外边。
为什么要这么做呢?道理是什么呢?

集群你们使用下来有什么坑吗

我感觉是这样一整个正常流程走下来很流畅,另外如果有几十个错误这样嵌套起来这代码没法写也没法看 ̄  ̄)σ

及时 return, 免得面条式代码, 提高可读性

  1. 客户端设置 client_id 的坑. 2. Unsubscribe 和 Close 的坑: Unsubscribe 会在 server 端移除该 subject 的持久化, Close 不会. 集群方面的坑暂时没遇到, 这个 readme 一定要看 https://github.com/nats-io/nats-streaming-server/blob/master/README.md

在Golang(Go语言)中,错误处理是一个关键且实用的编程概念,特别是在Go 1及后续版本中。Go语言通过内置的error类型和一系列惯用法来处理错误,这使得错误处理既灵活又强大。

  1. 返回错误:Go中的函数经常通过返回两个值来处理错误,其中第二个值通常是error类型。这种设计允许调用者检查并处理错误。

  2. 使用if语句检查错误:调用函数后,应立即使用if语句检查返回的错误是否为nil。如果错误不为nil,则执行相应的错误处理逻辑。

  3. 自定义错误:通过实现error接口(即Error()方法),可以创建自定义错误类型,这有助于提供更丰富和有意义的错误信息。

  4. 错误包装与追踪:在Go 1.13及更高版本中,可以使用fmt.Errorf%w动词来包装错误,这有助于保留原始错误的上下文和堆栈信息,便于调试。

  5. 使用panicrecover:虽然不常用于常规错误处理,但在某些情况下(如不可恢复的错误),可以使用panic来中断程序执行,并通过recover在defer函数中恢复。

  6. 日志记录:在处理错误时,使用日志记录库(如logzaplogrus)来记录错误信息,这对于生产环境中的故障排查非常有用。

总之,Go语言的错误处理机制简洁而强大,通过遵循上述最佳实践,可以编写出健壮且易于维护的代码。

回到顶部