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() ...

相关推荐

  1. golang 糟糕错误处理

    2024-03-11 11:20:05       21 阅读
  2. 记录golang日常错误处理

    2024-03-11 11:20:05       15 阅读
  3. 探索 Golang错误处理机制与最佳实践

    2024-03-11 11:20:05       37 阅读
  4. golang标准库错误处理及自定义错误处理示例

    2024-03-11 11:20:05       9 阅读
  5. 12306 抢票糟糕体验

    2024-03-11 11:20:05       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-11 11:20:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-11 11:20:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-11 11:20:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-11 11:20:05       20 阅读

热门阅读

  1. Golang 写日志到文件

    2024-03-11 11:20:05       17 阅读
  2. Spring事件发布与监听

    2024-03-11 11:20:05       20 阅读
  3. Github——个人项目的二维码免费生成

    2024-03-11 11:20:05       16 阅读
  4. 探索 MySQL 扩展 EXPLAIN 输出格式

    2024-03-11 11:20:05       18 阅读
  5. 设计模式(单例模式)

    2024-03-11 11:20:05       21 阅读
  6. C++核心编程

    2024-03-11 11:20:05       22 阅读