Go在工程实践的错误处理
Golang在工程实践中的错误处理 彭友顺 石墨文档 产研负责人 目 录 为什么我们处理错误会这么慢 01 如何完善错误信息 02 优雅处理错误信息 03 分布式错误处理 04 错误信息手册的必要性 05 为什么我们处理错误 会这么慢 第一部分 错误信息不够完善 why 原因 出现 错误 定位 慢 恢复 慢 效率低 为什么我们处理错误会这么慢 错误处理不够优雅 分布式错误难以串联 优雅处理错误信息 第三部分 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 假设用户反馈了无法打开一个文件 我们的程序员非常认真 记录了文件不存在的错误日志 • 同样的错误信息,非常多的杂音 • 每个Error,都去查看一次对应代码,排查效率低 • 占用存储空间 • 最外层入口处只记录一次错误日志 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 日志分析不出是哪个service 调用了MySQL 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 不要透传错误 错误码唯一性 记录一次错误 • 不能透传错误,fmt.Errorf • 如果不考虑性能 • 日志开启Stack • 错误追加Stack 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 文件不存在 数据表里不存在0 码力 | 30 页 | 3.11 MB | 1 年前3Go Web编程
国际化和本地化 10.1 设置默认地区 10.2 本地化资源 10.3 国际化站点 4 10.4 小结 11.错误处理,调试和测试 11.1 错误处理 11.2 使用GDB调试 11.3 Go怎么写测试用例 11.4 小结 12.部署与维护 12.1 应用日志 12.2 网站错误处理 12.3 应用部署 12.4 备份和恢复 12.5 小结 13.如何设计一个Web框架 13.1 项目规划 者那些缺失的地方,请一起参与到这个开 源项目中来,让我们的这个库争取成为Go的标准库。 links links 目录 上一节: 国际化站点 下一节: 错误处理,故障排除和测试 225 11 错误处理,调试和测试 11 错误处理,调试和测试 我们经常会看到很多程序员大部分的"编程"时间都花费在检查bug和修复bug上。无论你是在编写修改代码还是重构系 统,几乎都是花费大量的时间在进 但是遗憾的是很多程序员不愿意在错误处理、调试和测试能力上下工夫,导致后面应用上线之后查找错误、定位问题 花费更多的时间。所以我们在设计应用之前就做好错误处理规划、测试用例等,那么将来修改代码、升级系统都将变 得简单。 开发Web应用过程中,错误自然难免,那么如何更好的找到错误原因,解决问题呢?11.1小节将介绍Go语言中如何处 理错误,如何设计自己的包、函数的错误处理,11.2小节将介绍如何使用0 码力 | 295 页 | 5.91 MB | 1 年前3Go基础语法宝典
goroutine channels Buffered Channels Range和Close Select 超时 runtime goroutine 错误处理 Error类型 自定义Error 错误处理 总结 更多Golang资源包:https://github.com/0voice/Introduction-to-Golang 关键字 Go语言设计的关键字,了解这些关键字有助于命名变量的冲突避免 返回正在执行和排队的任务总数 GOMAXPROCS : 用来设置可以并行计算的CPU核数的最大值,并返回之前的值。 错误处理 Go语言主要的设计准则是:简洁、明白,简洁是指语法和C类似,相当的简单,明白是指任何语句都是 很明显的,不含有任何隐含的东西,在错误处理方案的设计中也贯彻了这一思想。 在C语言里面是通过返回 -1 或者 NULL 之类的信息来表示错误,但是对于使用者来说,不查看相应的API os.Open 打开一个文件,如果出现错误,那么就会调用 log.Fatal 来输出错误信 息: 类似于 os.Open 函数,标准包中所有可能出错的API都会返回一个 error 变量,以方便错误处理,这个 小节将详细地介绍 error 类型的设计,和讨论开发Web应用中如何更好地处理 error 。 Error类型 error类型是一个接口类型,这是它的定义: error是一个内置的接口类型,可以在0 码力 | 47 页 | 1020.34 KB | 1 年前3Go 入门指南(The way to Go)
数据 12.10 XML 数据格式 12.11 用 Gob 传输数据 12.12 Go 中的密码学 第13章:错误处理与测试 13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 16.5 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18 语言的函数式和面 向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用错误处理机 制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发和多核应用的基 本技巧的讲解(第 14 章)。最后,我们会讨论如何将 Go 语言应用到分布式和0 码力 | 466 页 | 4.44 MB | 1 年前3Go读书会第二期
并发原语的原理与应用模式 • 低级同步原语 (sync 和 atomic) 并发:优先考虑并发设计 Part7 – 错误处理 践行哲学,遵循惯例,认清本质,理解原理 • 错误处理的几种策略 • 优化 if err != nil • Panic 不是错误处理 错误处理:保守与创新 Part8 – 编程实践:测试、调试与性能剖析 践行哲学,遵循惯例,认清本质,理解原理 • Go 测试惯例与组织形式0 码力 | 26 页 | 4.55 MB | 1 年前3Go 入门指南(The way to Go)
言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用 错误处理机制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发 和多核应用的基本技巧的讲解(第 14 章)。最后,我们会讨论如何将 Go 语言应用到分布式和 节)new() 是一个函数,不要忘记它 的括号 Go入门指南 - 118 - 本文档使用 看云 构建 copy、 append 用于复制和连接切片 panic、 recover 两者均用于错误处理机制 print、 println 底层打印函数(详见第 4.2 节),在部署环境中建议使用 fmt 包 complex、 real imag 用于创建和操作复数(详见第 4.5.2.2 now {77 Sunset Strip} */ 附录37深入阐述了反射概念。 Go入门指南 - 250 - 本文档使用 看云 构建 第三部分:Go 高级编程 第12章:读写数据 第13章:错误处理与测试 第12章 读写数据 读写数据 除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出。 12.1 读取用户的输入 我们如何读取用户的键盘(控制台)输入呢?从键盘和标准输入0 码力 | 380 页 | 2.97 MB | 1 年前3Golang 入门笔记
的变量。 案例 接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起, 任何其他类型只要实现了这些方法就是实现了这个接口。 案例 错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface { Error() string } 并发 Go 语言支持并发,我们只需要通过0 码力 | 2 页 | 511.29 KB | 1 年前32.3 用golang写一个操作系统
最后觉得很合理 写代码的时间很短,测试和查问题的时间很多,相当多的时间是因为某个错误忽 略或处理的缺失。 多加⼏几⾏行代码占位,视觉提醒和后期查问题都很⽅方便 错误处理 l ⼤大道⾄至简 gorou8ne,接口,数据结构,Web l ⽆无⽤用的都会被舍弃0 码力 | 33 页 | 1014.12 KB | 1 年前3Go vs. GoPlus(Go+)
-继承、构造/析构函数、虚函数、函数重载等 • 简化的符号访问权限控制 • 取消隐藏的 this 指针 -改为显式定义的 receiver 对象 • OOP 编程核心价值原来如此简单 -只是多数人都无法看透 惊喜5:错误处理规范 • 函数多返回值 • 内置的 error 类型 • defer • 例子 f, err := os.Open(file) if err != nil {0 码力 | 54 页 | 1.82 MB | 1 年前3
共 9 条
- 1