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

错误处理:返回内置错误与自定义类型

错误处理:返回内置错误与自定义类型

Go
PIPIONE 2022-09-12 20:48:36
在 Go 的标准库中,内置用于错误处理。这篇文章使用了 std 库中的一些示例来演示错误处理在 Go 中的工作原理。errorpackage nettype Error interface {    error    Timeout() bool   // Is the error a timeout?    Temporary() bool // Is the error temporary?}if nerr, ok := err.(net.Error); ok && nerr.Temporary() {    time.Sleep(1e9)    continue}if err != nil {    log.Fatal(err)}我想知道坚持这一公约有什么好处。如果我们返回自定义类型怎么办?例如 类型。net.Error
查看完整描述

2 回答

?
至尊宝的传说

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

我假设您正在谈论与.DoRequest() errorDoRequest() net.SomeSpecificError


以下代码




type CustomError struct {

}


func (CustomError) Error() string {

    return "custom error"

}


func DoRequest() *CustomError {

    return nil

}


func MarkTaskComplete() error {

    return nil

}


func main() {

    err := DoRequest()

    if err != nil {

        log.Fatal(err)

    }

    err = MarkTaskComplete()

    if err != nil {

        log.Fatal(err)

    }

}

将无法编译,因为返回的错误无法分配给类型为 的 err 变量。MarkTaskComplete*SomeError


第二个缺点是,您不能从 除 以外的任何其他错误返回。在某些情况下,您可能会从此类限制中受益,但在大多数情况下,这种方法更灵活。特别是当您的函数调用另一个函数时。DoRequestSomeErrorerror


关于错误包装也值得一读


查看完整回答
反对 回复 2022-09-12
?
湖上湖

TA贡献2003条经验 获得超2个赞

客户类型的好处,即净。错误是:


    type Error interface {


    error

    Timeout() bool   // Is the error a timeout?

    Temporary() bool // Is the error temporary?

}

上述内容的优点是更具描述性。我们将获取有关错误的更多信息,例如它是超时错误还是临时错误。


除此之外,我们还了解了主要字段“error”中的主要数据,在上面的示例中,这是一个字符串。


type error interface {

    Error() string

}


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

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