Go 错误日志处理

是不是所有的 if err != nil 的地方都应该输出错误日志?

打印过多的错误日志会导致日志文件变得冗长和难以阅读。

其次,重复的错误信息会增加冗余。

此外,每一层都打印错误日志,一旦错误信息设计不当,可能会导致上下文信息的丢失。

1、案例

假设我们有一个五层的Go函数调用栈,其中最底层的函数level4Function出现了一个错误 

package main

import (
	"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("出了问题")
	if err != nil {
		log.Printf("level4Function: %v", err)
		return err
	}
	return nil
}

 每个函数中都输出错误日志并返回错误值

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

2. 实践技巧 

 应该只在最顶层的函数中输出错误日志,而在下层函数中返回错误值

package main

import (
	"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("出现了问题")
	if err != nil {
		return fmt.Errorf("level4Function: %w", err)
	}
	return nil
}

3、总结

在编写Go代码时,请记住要么返回错误值,要么输出日志,不要两者都做。通过合理地处理错误,我们可以编写出更可靠、更易于调试的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VCRUNTIME140_1.dll丢失是怎么回事?vcruntime140_1.dll无法继续执行代码的处理方法

VCRUNTIME140_1.dll丢失是怎么回事?问出这样的问题的人,一般是遇到vcruntime140_1.dll无法继续执行代码的问题了,找不到VCRUNTIME140_1.dll文件,那么程序就肯定是启动不了的,程序的启动是需要VCRUNTIME140_1.dll文件的…

全局数据 与 singleton 类的选择

1,singleton 相对于全局数据的优势 使用 Singleton 类相对于全局数据具有以下好处: 1.1. 延迟初始化:Singleton 类可以实现延迟初始化,即在需要时才创建实例,而全局数据在程序启动时就会被初始化。这可以节省资源并提…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件,用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项,用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

【常用的队列总结】

文章目录 队列的介绍Queue队列的基本概念与操作队列的基本概念 常见的队列介绍非阻塞队列LinkedList:ArrayDeque:PriorityQueue: 阻塞队列ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue DelayQueueSynchronousQueue 队列的介绍 Queue队列的基本概念与操作 在 …

使用html2canvas和jspdf导出pdf包含跨页以及页脚

首先要下载两个文件,一个为html2canvas.min.js,另一个是jspdf.umd.min.js这两个文件分别下载的地址我也附录上,都在官网git: html2canvas.min.js: https://html2canvas.hertzen.com/dist/html2canvas.min.js jspdf.umd.min.js: …

Docker 快速搭建 MongoDB 4.x 集群(一主一从)

目录 1. 生成 mongo-file2. 启动主节点3. 启动从节点4. 配置副本集5. 注意事项 环境:MongoDB 4.0.25,Alma Linux(建议使用 Linux) 部署的时候是在同一个及其上操作的,实际可以放在不同机器上。 截止到 2024年05月&…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后,大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战,欢迎您在OceanBase社区问答论坛中交流、讨论。此次,《DBA从入门到…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

以太坊现货ETF获批:引发ETH价格暴涨,市场热议达到高潮

2024年5月24日,北京时间,以太坊现货ETF正式获得美国证券交易委员会(SEC)的批准,成为继比特币之后,美国主权政府承认的又一加密货币基金产品。这一意外的利好消息引发了加密货币市场的狂欢,以太坊…

阳光电源临摹品引发的EMC正向设计思考

画画可以临摹。画电路板临摹的人更多。 抄板,抄的是过去的板子,容易出问题。现在市场竞争激烈,欧美客户对出口产品的标准要求推陈出新,防不胜防。由于市场的竞争,欧洲客户已经意识到EMC电磁兼容的重要性,不…

【PID算法详解】

PID算法 PID算法介绍用途pid数学表达式及其含义P算法D算法I算法 PID总结数学公式转换代码设计实际运用PID代码实现 PID算法介绍 PID控制器是一种广泛应用于工业控制系统的反馈控制器,它通过比例(Proportional)、积分(Integral&am…

LeetCode450删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤&#xff1…

合约的值类型

基本数据类型:整数、枚举、布尔(类似java的数据类型)Address、Contract(这两种是solidity特有的数据类型)Fixed byte array(定长字节数组) Integer(int/uint) int/uint 以8位字节递增&#xf…

代码随想录算法训练营Day2|977.有序数组的平方、59.螺旋矩阵||、 209.长度最小的子数组

977.有序数组的平方 这道题给出的原数组有两个特点: 1、由小到大 2、有负数有正数 因此,这个数组平方后的数应该是从两头向中间的0减小的,但是两头的大小需要我们用两个指针便历之后去判断大小。在遍历的同时left指针向右走,righ…

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架,它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式,以及用代码示例来解释它们: 一、工厂模式(Factory Pattern&#xff…

DIYGW UniApp可视化开发工具:前端开发人员的新宠

在前端开发的领域中,API接口的测试与调试一直是开发人员面临的挑战之一。传统的测试工具虽然能够完成基本的测试任务,但在效率、易用性和直观性方面仍有提升的空间。随着技术的发展,DIYGW UniApp可视化工具应运而生,为开发人员提供…

智慧园区:打造未来城市的新模式

随着城市化进程的加速和科技创新的推动,城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性,是一个亟待解决的问题。在这个背景下,智慧园区作为一种新型的城市发展模式,引起了越来越多的关注和探索。 什么是智慧园区&…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面,登陆管理员账号 (测试服务器安装的gitlab,浏览器输入ip或配置的gitlab地址) 创建新项目 使用gitlab创建项目 创建一个新项目(忽略分组) (忽略分组) 在创建工…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…