当前位置: 首页 > news >正文

golang 糟糕的错误处理

关于golang的糟糕错误处理,我持反对意见,因此写个博客记录一下

golang的书中说:像下面代码一样,创建一个布尔型变量用于测试错误条件是多余的:

然而在个人看来,代码非常完美,言简意赅,一个bool就控制了if条件,多么清晰,golang设计者一点也没考虑实际业务场景

var good bool// 测试一个错误,`good` 被赋为 `true` 或者 `false`if !good {return errors.New("things aren’t good")}

书中还说了:避免错误检测使代码变得混乱:避免写出这样的代码:

个人看法:golang的语言设计者,完全没考虑实际业务场景和开发人员会遇到什么样的开发场景,遇到什么样的产品,遇到什么样的开发周期,当需求来了要你今天开发,明天就上线,就只能这样写代码,语言的设计者就设定了代码中不得不出现很多的err的判断,又说这个很混乱,简直是自取其辱!~

... err1 := api.Func1()
if err1 != nil {fmt.Println("err: " + err.Error())return
}
err2 := api.Func2()
if err2 != nil {
...return
}    

书里面又说了:首先,包括在一个初始化的 if 语句中对函数的调用。但即使代码中到处都是以 if 语句的形式通知错误(通过打印错误信息)。通过这种方式,很难分辨什么是正常的程序逻辑,什么是错误检测或错误通知。还需注意的是,大部分代码都是致力于错误的检测。通常解决此问题的好办法是尽可能以闭包的形式封装你的错误检测,例如下面的代码:

个人看法:首先,下面的代码确实要优雅一些,但是,实际场景,不可能这么完美,出入参,方法A是结构体,方法B是数组,方法C是字符串,根本不能写一个handler来全部处理,设计的人既然想到了使用handler来举例统一处理请求的检查,为什么就非要设定err呢?

func httpRequestHandler(w http.ResponseWriter, req *http.Request) {err := func () error {if req.Method != "GET" {return errors.New("expected GET")}if input := parseInput(req); input != "command" {return errors.New("malformed command")}// 可以在此进行其他的错误检测} ()if err != nil {w.WriteHeader(400)io.WriteString(w, err)return}doSomething() ...

相关文章:

  • 《辐射4》是一款什么样的游戏 怎样在mac电脑上玩到《辐射4》辐射4攻略 辐射4开局加点 怎么在Mac电脑玩Steam游戏
  • 基于SpringBoot+MYSQL的网页时装购物系统
  • 蓝桥杯复习之差分
  • 计算题--单代号双代号网络图
  • CCF-A推荐会议 安全界顶会ACM CCS‘24 4月29日第二轮投稿!共建更安全的数字世界!
  • UE5 C++ TPS开发 学习记录(七)
  • 6_怎么看原理图之协议类接口之LCD笔记
  • BUUCTF-Misc-百里挑一
  • AI领域再出“王炸“----Claude3是否会成为下一个“神“
  • 24计算机考研深大经验分享(计算机专业考研综合安排)
  • 2024.3.6 FreeRTOS 作业
  • C#,数值计算,求解微分方程的预测校正法(修正欧拉法)算法与源代码
  • 【论文翻译】结构化状态空间模型
  • 13【CPP】Hash(闭散列||开散列)
  • 软考笔记--软件架构风格
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • ES6系列(二)变量的解构赋值
  • flask接收请求并推入栈
  • HTTP 简介
  • jquery cookie
  • Linux gpio口使用方法
  • PermissionScope Swift4 兼容问题
  • PHP 的 SAPI 是个什么东西
  • spring cloud gateway 源码解析(4)跨域问题处理
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue.js源码(2):初探List Rendering
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 关于Flux,Vuex,Redux的思考
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 简单实现一个textarea自适应高度
  • 每天10道Java面试题,跟我走,offer有!
  • 那些被忽略的 JavaScript 数组方法细节
  • 世界上最简单的无等待算法(getAndIncrement)
  • 思否第一天
  • 详解NodeJs流之一
  • 写给高年级小学生看的《Bash 指南》
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #HarmonyOS:基础语法
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1)常见O(n^2)排序算法解析
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C)一些题4
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (八)Flask之app.route装饰器函数的参数
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四) Graphivz 颜色选择
  • (五)c52学习之旅-静态数码管
  • (译)2019年前端性能优化清单 — 下篇
  • (转)编辑寄语:因为爱心,所以美丽
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET框架设计—常被忽视的C#设计技巧
  • @NoArgsConstructor和@AllArgsConstructor,@Builder