Go 错误日志处理

news2024/9/22 3:42:28

是不是所有的 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代码时,请记住要么返回错误值,要么输出日志,不要两者都做。通过合理地处理错误,我们可以编写出更可靠、更易于调试的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】——GCD再学习

文章目录 一、GCD的定义二、GCD 任务和队列1.任务2.队列 三、GCD 的使用1.创建队列2.创建任务3.队列任务 组合方式并发队列 同步执行异步执行 并发队列同步执行 串行队列异步执行 串行队列同步执行 主队列在主线程中调用 同步执行 主队列在其它线程中调用 同步执行 主队…

大模型实战-动手实现单agent

文章目录 入口cli_main.py工具tools.pyprompt prompt_cn.pyLLM 推理 model_provider.py致谢 agent 的核心思想:不断调用 LLM(多轮对话),让 LLM 按照指定的格式(例如 json)进行回复,提取 LLM 回复…

vue 区分多环境打包

需求:区分不同的环境(测试、正式环境),接口文档地址不同; 配置步骤: 1、在根目录下面新建 .env.xxx 文件(xxx 根据环境不同配置) 文件中一定要配置的参数项为:NODE_ENV…

自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割| 文献速递-深度学习肿瘤自动分割

Title 题目 Cascade multiscale residual attention CNNs with adaptive ROI for automatic brain tumor segmentation 自适应感兴趣区域的级联多尺度残差注意力CNN用于自动脑肿瘤分割 01 文献速递介绍 脑肿瘤是大脑细胞异常和不受控制的增长,被认为是神经系统…

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例,然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式: const observer new IntersectionObserver(c…

vue 笔记02

目录 01 事件修饰符 02 按键修饰符 03 v-bind属性 04 vue-axios的基本使用 05 vue的生命周期 06 vue生命周期涉及到的其他的知识点 01 事件修饰符 vue的事件修饰符 事件名称.修饰符1.修饰符2...事件驱动函数 stop 阻止冒泡修饰符 prevent 阻止默认行为 once 当前事件只触…

牛客题霸-SQL大厂面试真题(一)

本文基于前段时间学习总结的 MySQL 相关的查询语法,在牛客网找了相应的 MySQL 题目进行练习,以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多,因此本文不再展示,只提供 MySQL 代码与示例输出。 以下内容是…

期权方向性交易策略怎么制定?

今天期权懂带你了解期权方向性交易策略怎么制定?国内的期权品种已经多达十几种,其中ETF期权是流量最大的品种,截止今日已经上市了十二种ETF期权。 期权方向性交易策略怎么制定? 期权方向性交易策略主要依赖于投资者对市场未来走势…

作业job——kettle开发30

一、作业 大多数ETL项目都需要完成各种各样的维护工作。 例如,如何传送文件;验证数据库表是否存在,等等。而这些操作都是按照一定顺序完成。因为转换以并行方式执行,就需要一个可以串行执行的作业来处理这些操作。 一个作业包含一个或多个作…

WHLUG活动回顾 | 4大技术分享!干货满满,热闹非凡!

内容来源:deepin(深度)社区 2024 年 5 月 25 日下午,由 deepin(深度)社区华中科技大学开放原子开源俱乐部联合举办的武汉 Linux 爱好者线下沙龙活动(WHLUG)在华中科技大学成功举办。…

vue3中的toRaw API

文章目录 什么是toRaw API?为什么需要toRaw?如何使用toRaw?实际应用场景 这两天在写项目的时候,发现了一个之前没用过的api,于是上网查了一下,发现这个api还是挺常用,所以在这记录一下 什么是t…

Android11 事件分发流程

在Android 11 输入系统之InputDispatcher和应用窗口建立联系一文中介绍到,当InputDispatcher写入数据后,客户端这边就会调用handleEvent方法接收数据 //frameworks\base\core\jni\android_view_InputEventReceiver.cpp int NativeInputEventReceiver::h…

springboot项目war包部署到腾讯云服务器

一、购买服务器 试用 1 个月(需要实名和人脸验证) 云产品免费体验馆_云产品免费试用_个人云产品试用-腾讯云 重置密码 登录以后 二、云服务器安装MySql 登录后,接下来的一切我们使用linux命令来操作。 1、卸载centos默认安装的mariadb rp…

axios和ts的简单使用

按照官网的使用案例简单记下笔记 1:安装 npm install axios 2:案例 一个简单的config配置信息 // 发起一个post请求 axios({method: post,url: /user/12345,data: {firstName: Fred,lastName: Flintstone} }); case // 在 node.js 用GET请求获取…

有哪些藏文翻译器在线翻译?工具分享

有哪些藏文翻译器在线翻译?随着全球化的推进,语言之间的交流变得越来越重要。藏语作为中华民族的重要语言之一,其翻译需求也日益增加。为了满足这一需求,市场上涌现出了多款藏文翻译器在线翻译工具,它们以其高效、准确…

Qt for android : libusb在android中使用

简介 如何在Qt for Android中使用libusb, 其实libusb的文档里面都写的很清楚, 这里只是稍微做下整理。 libusb libusb github源码 libusb release的版本, 有编译好的静态 步骤 1. 下载libusb libusb v1.0.027 源码包 2. 整理提取libusb android使用源…

怎么使用Stable diffusion中的models

Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model,是预先训练好的Stable diffusion权重,用于生成特定风格的图像。模型生成的图像类型取决于训练图像。 如果训练数据中从未出现过猫的图像,模型就无法生成猫的…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步(主从复制)三台mysql服务器搭建主从复制,要求不可以用root帐号同步,要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置 MySQL主从复制 主从复…

FastAPI - 组织模块2

FastAPI没有强制指定某种格式来组织项目结构,开发者可以根据自己喜好和项目需要来定制自己的项目结构。 https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/ 在项目根目录创建python包routers,然后创建member.py文件 member.py文件内容 …

嘴尚绝卤味:健康美味新选择,开启味蕾新旅程!

在这个美食文化繁荣的时代,卤味作为传统小吃界的一颗璀璨明珠,一直深受大众的喜爱。而今天,我要向大家介绍一款不仅美味可口,更注重健康营养的卤味品牌——嘴尚绝卤味。它以其独特的制作工艺和丰富的口感,成为众多卤味…