小编Dan*_*n W的帖子

我如何找出 go 中的错误是什么类型?

我不确定如何确切地表达这个问题,而且我看到其他人提出了类似的问题,但没有真正给出答案(这告诉我我问了错误的问题,但我不知道如何解决这个问题)。

我正在尝试学习一些基本的 Go,但在第一个障碍上就遇到了困难。

在我的测试代码中,我对一个不存在的域执行基本的 http GET 操作,以触发 DNS 警告。我发现 err.error() 返回一个字符串,因此为了断言它是否是 DNS 错误,我使用了字符串比较:

resp, err := http.Get(link)
if err != nil {
    if strings.Contains(err.Error(), "no such host") == true {
        return "no such host"
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是很hacky,所以我做了一些谷歌搜索,看看是否有更好的方法来找出引发了什么样的错误,我发现了以下答案:

如何检查特定的 golang net/http 错误代码?

包“errors”具有 As 功能,用于解包特定的错误类型,包“net”具有 *DNSError 类型。所以:

var dnsErr *net.DNSError
if errors.As(err, &dnsErr) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效,但我完全不知道这个结论是如何得出的。以下是我试图理解这一点的方法,我想知道我哪里出错了。我(模糊地)理解 .Is() 和 .As() 正在做什么,但我不明白的是如何计算出什么错误“类型”来提供这些函数而无需猜测或先验知识。

我查看了 client.get() 文档,其中写着:

任何返回的错误都将是 *url.Error 类型。

更多的谷歌搜索,我发现我需要将错误转换为该类型才能使用它:

urlErr := err.(*url.Error)
Run Code Online (Sandbox Code Playgroud)

*url.Error 包含:

&url.Error{Op:"Get", URL:"http://doesnotexistkjdfhgsdfsdf.com", Err:(*net.OpError)(0xc00021a2d0)}
Run Code Online (Sandbox Code Playgroud)

所以我然后查看 url.Error 中包含的 …

error-handling go go-interface

5
推荐指数
1
解决办法
6860
查看次数

标签 统计

error-handling ×1

go ×1

go-interface ×1