为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 GO 中忽略返回的错误

如何在 GO 中忽略返回的错误

Go
暮色呼如 2021-10-18 14:13:43
我今天开始学习围棋。让我发疯的一件事是err返回的参数。假设我需要嵌套几个函数。像这样:return string(json.Marshal(MyData))或更复杂的例子:return func1(func2(func3(MyData)))真的有必要写:tmp1 , _ = func3(MyData)tmp2 , _ = func2(tmp1)tmp3 , _ = func1(tmp2)return tmp3这很烦人!有没有办法让代码看起来更干净?
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

可以定义一个函数来忽略错误,但是 Go 缺乏泛型,所以你必须到处使用 interface{} 和类型转换,在这个过程中失去了类型检查器的大量静态保证。它非常丑陋。不要这样做。


func ignoreError(val interface {}, err error) interface {} {

    return val

}

在每次调用时ignoreError()都必须将类型转换为预期的返回类型。


查看完整回答
反对 回复 2021-10-18
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您经常会看到的一种可能的抽象模式是使用通用错误处理程序。


这不会阻止您处理错误值,但它确实将错误处理从代码的其余部分抽象出来。


请注意,像这样的抽象被认为是“非惯用的”Go,“纯”的方式是就地显式处理错误。不过,这种由恐慌驱动的替代方案仍然非常有用,尤其是对于您只想将所有错误转储到控制台或日志文件中的脚本进行快速原型设计。


对于可重用的包,我会坚持使用冗长的显式方式,因为其他人会期望产生错误的函数实际返回错误值,而不是使用恐慌恢复机制。


package main


import (

    utils

)


func main() {

    defer func() {

        utils.Handle(func(err error) {

            // Handle errors in a generic way, 

            // for example using println, or writing to http 

        })

    }()


    var result, err := someFragileFunction()

    Check(err)

}

package utils


func Check(err error) {

    if err != nil {

        panic(err)

    }

}


func Handle(handler func(err error))  {

    if r := recover(); r != nil {

        if err, ok := r.(error); ok {

            handler(err)

        } else {

            panic(r)

        }

    }

}


查看完整回答
反对 回复 2021-10-18
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

真正的答案是:不。

永远不要忽视错误。

严重地。错误是有原因的。如果函数返回错误,则几乎总是意味着在程序运行期间,即使它 100%无错误, 该函数也有可能失败。如果是这样,您通常不想就好像什么也没发生一样继续前进。

如果您绝对确定您正在以一种确保它永远不会返回非零错误的方式使用函数(除非您的程序中存在错误,并且总是存在),您可能想要编写一个Must- style 函数就像在template中一样,它会因返回的错误值而恐慌。

错误处理不是噪音。这不是杂乱。这不是你想要摆脱的东西。如果看起来你的程序的 50% 是错误处理,那是因为你的程序的 50% 是并且应该是错误处理。


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 499 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信