当前位置:首页 > 科技  > 软件

要么返回错误值,要么输出日志,别两样都做

来源: 责编: 时间:2024-04-15 18:12:13 248观看
导读1. 缘起这周,一个产品团队内进行Go代码评审时,得到了一个结论:所有的if err != nil的地方都应该输出错误日志。然而,这种做法并不是最佳实践,它存在一些问题。首先,打印过多的错误日志会导致日志文件变得冗长和难以阅读。其

1. 缘起

这周,一个产品团队内进行Go代码评审时,得到了一个结论:所有的if err != nil的地方都应该输出错误日志。然而,这种做法并不是最佳实践,它存在一些问题。jcX28资讯网——每日最新资讯28at.com

首先,打印过多的错误日志会导致日志文件变得冗长和难以阅读。其次,重复的错误信息会增加冗余。此外,每一层都打印错误日志,一旦错误信息设计不当,可能会导致上下文信息的丢失。jcX28资讯网——每日最新资讯28at.com

让我们来看一个示例,说明为什么同时输出错误日志和返回错误值会导致问题。假设我们有一个五层的Go函数调用栈,其中最底层的函数level4Function出现了一个错误:jcX28资讯网——每日最新资讯28at.com

package mainimport ( "fmt" "log")func main() { if err := topFunction(); err != nil {  log.Printf("Error: %v", err) }}func topFunction() error { err := level1Function() if err != nil {  log.Printf("topFunction: %v", err)  return err } return nil}func level1Function() error { err := level2Function() if err != nil {  log.Printf("level1Function: %v", err)  return err } return nil}func level2Function() error { err := level3Function() if err != nil {  log.Printf("level2Function: %v", err)  return err } return nil}func level3Function() error { err := level4Function() if err != nil {  log.Printf("level3Function: %v", err)  return err } return nil}func level4Function() error { err := fmt.Errorf("something went wrong") log.Printf("level4Function: %v", err) return err}

在这个示例中,我们在每个函数中都输出错误日志并返回错误值。我们运行一下这个程序:jcX28资讯网——每日最新资讯28at.com

$go run main.go 2024/04/14 23:10:05 level4Function: something went wrong2024/04/14 23:10:05 level3Function: something went wrong2024/04/14 23:10:05 level2Function: something went wrong2024/04/14 23:10:05 level1Function: something went wrong2024/04/14 23:10:05 topFunction: something went wrong2024/04/14 23:10:05 Error: something went wrong

当我们运行程序时,日志文件会出现重复的错误信息,并且上下文信息不易于进行链式追踪,因为每个函数只打印了特定错误的信息,而没有提供之前错误的上下文。jcX28资讯网——每日最新资讯28at.com

2. 好的实践技巧

为了解决上述问题,我们需要采用一种更好的实践方法。面向调用层次较深的函数调用栈,我们应该只在最顶层的函数中输出错误日志,而在下层函数中返回错误值。但是,我们需要精心构造错误值,以形成基于wrapped error的错误链。jcX28资讯网——每日最新资讯28at.com

让我们修改示例代码,按照最佳实践进行错误处理:jcX28资讯网——每日最新资讯28at.com

package mainimport ( "fmt" "log")func main() { if err := topFunction(); err != nil {  log.Printf("Error: %v", err) }}func topFunction() error { err := level1Function() if err != nil {  return fmt.Errorf("topFunction: %w", err) } return nil}func level1Function() error { err := level2Function() if err != nil {  return fmt.Errorf("level1Function: %w", err) } return nil}func level2Function() error { err := level3Function() if err != nil {  return fmt.Errorf("level2Function: %w", err) } return nil}func level3Function() error { err := level4Function() if err != nil {  return fmt.Errorf("level3Function: %w", err) } return nil}func level4Function() error { err := fmt.Errorf("something went wrong") return fmt.Errorf("level4Function: %w", err)}

在这个修改后的示例中,我们在每个函数中使用fmt.Errorf+%w将错误包装为一个wrapped error,并将前一层的错误作为参数传递。通过这种方式,我们构建了一个错误链,其中每个错误都包含了之前发生的错误上下文。在最顶层的main函数中,我们使用日志库输出错误日志,下面是示例程序的运行结果:jcX28资讯网——每日最新资讯28at.com

2024/04/14 23:12:16 Error: topFunction: level1Function: level2Function: level3Function: level4Function: something went wrong

我们看到:通过这种方法,我们避免了重复的错误日志,并保留了错误的上下文信息,快速定位了根因。当运行修改后的程序时,我们会看到日志文件中只打印了完整的错误链,而不是重复的错误信息。通过调用链和精心设计的错误上下文,我们还可以看到函数调用链,这使得错误的调试和处理变得更加方便和可靠。jcX28资讯网——每日最新资讯28at.com

3. 小结

在前面的示例中,我们展示了同时输出错误日志和返回错误值的问题,并介绍了如何使用wrapped error来构建错误链。通过合理地处理错误,我们可以提高代码的可读性和可维护性,同时也有助于快速定位和解决问题。jcX28资讯网——每日最新资讯28at.com

总之,在编写Go代码时,请记住要么返回错误值,要么输出日志,不要两者都做。通过合理地处理错误,我们可以编写出更可靠、更易于调试的代码。jcX28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-83619-0.html要么返回错误值,要么输出日志,别两样都做

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 从 React 新官网学到的一个优秀实践妙招

下一篇: 不要在循环await啦,异步操作的六个最佳实践!

标签:
  • 热门焦点
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 苹果公司要求三星和LG Display生产「无边框」OLED iPhone显示屏

    据 The Elec 报道,苹果已要求其供应商为未来的 iPhone 型号开发「无边框」OLED 显示面板。苹果显然已要求三星和 LG Display 开发新的 OLED 显示面
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top