gpt4 book ai didi

go - 解释 Golang 错误代码

转载 作者:IT王子 更新时间:2023-10-29 01:26:48 25 4
gpt4 key购买 nike

所以我看到的大多数 go 错误处理示例只是将任何错误传递回堆栈。在某些时候,这些需要解释,这就是我正在尝试做的。这是我尝试的一个片段:

    resp, err := http.Get(string(url))
defer out_count.Dec()

if err != nil {

switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case http.ErrMissingFile:
fmt.Println("Missing File")
{some more cases here}
case io.EOF:
fmt.Println("EOF error found")
default:
fmt.Printf("Error type is %T\n", err)
panic(err)
}
return

这对我当前的情况不起作用(编辑以删除 url}:

ERROR: Failed to crawl "http://{removed URL}"
Error type is *url.Error
panic: Get http://{removed url}: EOF

goroutine 658 [running]:
runtime.panic(0x201868, 0x106352c0)
/usr/lib/go/src/pkg/runtime/panic.c:279 +0x1a0
github.com/cbehopkins/grab/grab.crawl(0x10606210, 0x27, 0x105184b0, 0x105184e0, 0x10500460)

我想不出让 switch 语句捕获此错误的方法,因为错误的文本每次都会更改并且没有我可以捕获的明确值。 (因为 URL 一直在变化)。现在也许我可以在 case 语句中进行某种正则表达式匹配或对错误字符串进行子 slice ,但这感觉是解决此问题的一种非常糟糕的方法。

有什么建议吗?一定有一种惯用的方法来捕捉这样的错误吧?

最佳答案

最简单的方法是在代码中包含包级错误值:

var URLFetchError = errors.New("Cannot fetch URL")

url := "http://www.google.com"
res, err := http.Get(url)
if err != nil {
return URLFetchError
}

开关然后变成:

switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case URLFetchError:
fmt.Println("Error fetching URL")

如果您想通过错误传递更多信息,您可以创建自己的自定义错误:

type MyError struct {
URL string
}

func (e MyError) Error() string {
return fmt.Sprintf("Error getting: %v", e.URL)
}

然后,您可以在需要时创建此错误。例如:

url := "http://www.google.com"
res, err := http.Get(url)
if err != nil {
return MyError{url}
}

最后,在您的错误检查方法中,您可以使用类型开关而不是简单的开关来获取错误:

switch err.(type) {
case MyError:
fmt.Println("Error:", err)
default:
fmt.Println("No Error")
}

在您的情况下,由于混合了常规错误,您可以将此检查包含在嵌套的 switch 中:

switch err {
case http.ErrBodyReadAfterClose:
fmt.Println("Read after close error")
case http.ErrMissingFile:
fmt.Println("Missing File")
case io.EOF:
fmt.Println("EOF error found")
default: // check for custom errors
switch err.(type) {
case MyError:
fmt.Println("custom error:", err)
default:
panic(err)
}
}

关于go - 解释 Golang 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com