go的标准化error处理

go的标准化error处理

文章目录

  • go的标准化error处理
    • 1、建议这样写错误处理
    • 2、怎么优化代码让其不再堆积

1、建议这样写错误处理

// 1
func autn() {var err errorif err != nil {// handle err}//do stuff
}// 2 
func a(r *http.Request) error {//err := r.ParseForm()//if err != nil {//	return err//}//return nil// 我们其实没有必要写这么多的代码,直接返回就可以了return r.ParseForm()// 这样用也可能造成递归的返回错误直到最上层也是原始的错误// 在处理错误的时候我们应该只做一个决定就是:记录日志或返回错误// 返回错误的时候尽量以 errors.New("包名:错误原因“) 的形式
}

2、怎么优化代码让其不再堆积

优化前:我们可以看到有4个地方都需要进行错误判断,我们可以想办法将所有的错误处理代码写到别的地方,进行调用即可。

type Header struct {Key, Value string
}
type Status struct {Code   intReason string
}func WriteResponse(w io.Writer, status Status, headers []Header, body io.Reader) error {_, err := fmt.Fprintf(w, "%d %s\r\n", status.Code, status.Reason)if err != nil {return err // 1}for _, h := range headers {_, err := fmt.Fprintf(w, "%s:%s\r\n", h.Key, h.Value)if err != nil {return err // 2}}_, err = fmt.Fprint(w, "\r\n")if err != nil {return err // 3}_, err = io.Copy(w, body)return err // 4
}

优化后:

type errWriter struct {w   io.Writererr error
}// 把判断错误的一些细节放到errWriter里面去
func (ew *errWriter) Write(p []byte) (int, error) {if ew.err != nil {return 0, ew.err}var n, err = ew.w.Write(p)if err != nil {ew.err = err}return n, nil
}func WriteResponse1(w io.Writer, status Status, headers []Header, body io.Reader) error {ew := &errWriter{w: w}fmt.Fprintf(ew, "%d %s\r\n", status.Code, status.Reason)for _, h := range headers {fmt.Fprintf(ew, "%s:%s\r\n", h.Key, h.Value)}fmt.Fprint(ew, "\r\n")io.Copy(ew, body)return ew.err
}

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

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

相关文章

算法打卡day34

今日任务: 1)62.不同路径 2)63.不同路径 II 3)复习day10 62.不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “S…

数据中心的网络架构设计,打造高效、安全的数字底座

数据中心的网络架构设计 一、数据中心网络架构设计原则 网络,作为数据中心的核心支柱,其结构精妙,由众多二层接入设备与少量三层设备共同编织而成。过去,数据中心网络规模有限,仅凭数十台设备的简单互连便能实现信息的畅通无阻。然而,随着技术与应用需求的飞速增长,数据…

Missing artifact org.opencv:opencv:jar:4.10.0 [opencv-4.10.0.jar]

Missing artifact org.opencv:opencv:jar:4.10.0 [opencv-4.10.0.jar] https://mvnrepository.com/artifact/org.opencv/opencv 根本就没有 找了个旧项目的opencv-410.jar修改下opencv-4.10.0.jar放到目录下面就好了 D:\localRepository\org\opencv\opencv\4.10.0 OpenCV-C…

[HDFS 相关Shell命令]

目录 HDFS 相关Shell命令: 相关文件操作命令: HDFS 相关Shell命令: 注意&#xff0c;下述命令中的<path>代表文件或目录的路径&#xff0c;<local_path>代表本地文件系统的路径&#xff0c;而<hdfs_path>代表HDFS上的路径。使用这些命令时&#xff0c;需要…

类的六个默认成员函数(上)

目录 构造函数 析构函数 拷贝构造函数 对于日期&#xff08;Date&#xff09;类&#xff0c;可以通过 Init 公有方法给对象设置日期&#xff0c;但如果每次创建对象时都调用该方法设置信息&#xff0c;未免有点麻烦&#xff0c;那能否在对象创建时&#xff0c;就将信息设置进…

鸿蒙OS开发学习:【第三方库调用】

介绍 本篇Codelab主要向开发者展示了在Stage模型中&#xff0c;如何调用已经上架到[三方库中心]的社区库和项目内创建的本地库。效果图如下&#xff1a; 相关概念 [Navigation]&#xff1a;一般作为Page页面的根容器&#xff0c;通过属性设置来展示页面的标题、工具栏、菜单。…

使用低空无人机图像对树种进行实例分割

在这项试点研究中,利用低空无人机图像开发了一种针对当地树种的机器学习实例分割模型,用于生态调查目的。实例分割包括个体树冠描绘和物种分类。 20 种树种及其相关学名已通过无人机图像进行了训练和收集,用于机器学习过程。为了评估 ML 模型的准确性,半监督分割图像将与已…

政安晨:【Keras机器学习实践要点】(二十七)—— 使用感知器进行图像分类

目录 简介 设置 准备数据 配置超参数 使用数据增强 实施前馈网络&#xff08;FFN&#xff09; 将创建修补程序作为一个层 实施补丁编码层 建立感知器模型 变换器模块 感知器模型 编译、培训和评估模式 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍…

Lua语法(五)——垃圾回收

参考链接: 系列链接: Lua语法(一) 系列链接: Lua语法(二)——闭包/日期和时间 系列链接: Lua语法(三)——元表与元方法 系列链接: Lua语法(四)——协程 系列链接: Lua语法(五)——垃圾回收 系列链接: Lua语法(六)——面相对象编程 Lua语法 五——垃圾回收 垃圾回收弱引用表__m…

并查集(Union-Find)介绍

并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合&#xff08;Disjoint Sets&#xff09;的合并及查询问题。它常常在某些图论算法中被使用&#xff0c;比如求解最小生成树的Kruskal算法中就需要使用并查集来判断加入某条边后是否会形成环。在实际应用中&#xf…

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年)

文章目录 前言1、多比特信号A,时钟域clk_a存在从4’d11到4’d12的变化过程中,若时钟域clk_b直接采用D触发器采样,可能采样到数据是2、Bod由1变成0,Arb会如何变化3、减少片外DRAM的访问,而代之以片内SRAM访问,这样可以降低访问功耗,降低片外DRAM,同时加大片内SRAM能节省…

Spring Boot集成Graphql快速入门Demo

1.Graphql介绍 GraphQL 是一个用于 API 的查询语言&#xff0c;是一个使用基于类型系统来执行查询的服务端运行时&#xff08;类型系统由你的数据定义&#xff09;。GraphQL 并没有和任何特定数据库或者存储引擎绑定&#xff0c;而是依靠你现有的代码和数据支撑。 优势 GraphQL…

【Android】【root remount】adb su如何添加密码校验

前言 客户想在user版本添加su 权限&#xff0c;并实现user版本的root remount功能。 当前思路时执行su时添加密码&#xff0c;如果密码正确设置 sys.变量为true。adb root时判断sys变量为true时&#xff0c;执行root动作。 su 添加密码实现 su.cpp 添加密码部分&#xff1a;…

npm install 报 ERESOLVE unable to resolve dependency tree 异常解决方法

问题 在安装项目依赖时&#xff0c;很大可能会遇到安装不成功的问题&#xff0c;其中有一个很大的原因&#xff0c;可能就是因为你的npm版本导致的。 1.npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree 2.ERESOLVE unable to resolve dependenc…

【C++之queue的应用及模拟实现】

C学习笔记---014 C之queue的应用及模拟实现1、queue的简单介绍2、queue的简单接口应用3、queue的模拟实现3.1、queue的结构一般的构建3.2、queue的适配器模式构建3.3、queue的主要接口函数 4、queue的模拟实现完整代码4.1、一般方式4.2、泛型模式 5、queue巩固练习题5.1、最小栈…

VSCode中 task.json 和 launch.json 的作用和参数解释以及配置教程

前言 由于 VS Code 并不是一个传统意义上的 IDE&#xff0c;所以初学者可能在使用过程中会有很多的疑惑&#xff0c;其中比较常见的一个问题就是 tasks.json和 launch.json两个文件分别有什么作用以及如何配置 tasks.json VSCode 官网提供的 tasks.json 配置教程 使用不同的…

UE4_导入内容_Alembic文件导入器

Alembic文件导入器 Alembic文件格式(.abc)是一个开放的计算机图形交换框架&#xff0c;它将复杂的动画化场景浓缩成一组非过程式的、与应用程序无关的烘焙几何结果。虚幻引擎4(UE4)允许你通过 Alembic导入器 导入你的Alembic文件&#xff0c;这让你可以在外部自由地创建复杂的…

什么是态势感知?

什么是态势感知&#xff1f; 同学&#xff0c;听说过态势感知吗&#xff1f;啥&#xff1f;不知道&#xff1f;不知道很正常&#xff0c;因为态势感知是一个比较小众、比较神秘的概念。为什么态势感知很神秘&#xff0c;首先是因为这是来自军事情报领域的概念&#xff0c;然后…

008Node.js模块、自定义模块和CommonJs

CommonJS API定义很多普通应用程序(主要指非浏览器的应用)使用的API&#xff0c;从而填补了这个空白。它的终极目标是提供一个类似Python&#xff0c;Ruby和Java标 准库。这样的话&#xff0c;开发者可以使用CommonJS API编写应用程序&#xff0c;然后这些应用可以运行在不同的…

【尝试】域名验证:配置github二级目录下的txt文件

【尝试】域名验证&#xff1a;配置github二级目录下的txt文件 写在最前面一、初始化本地仓库二、设置远程仓库1. 远程仓库 URL 没有设置或设置错误添加远程仓库修改远程仓库 2. 访问权限问题3. 仓库不存在步骤 1: 在你的仓库中添加文件步骤 2: 确认GitHub Pages设置步骤 3: 访问…