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

解读 Golang 错误代码

解读 Golang 错误代码

Go
拉风的咖菲猫 2022-03-03 15:12:37
因此,我看到的大多数 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.Errorpanic: Get http://{removed url}: EOFgoroutine 658 [running]:runtime.panic(0x201868, 0x106352c0)        /usr/lib/go/src/pkg/runtime/panic.c:279 +0x1a0github.com/cbehopkins/grab/grab.crawl(0x10606210, 0x27, 0x105184b0, 0x105184e0, 0x10500460)我想不出一种方法来让 switch 语句捕捉到这个错误,因为错误的文本每次都会改变,并且没有我可以捕捉到的明确值。(因为 URL 一直在变化)。现在也许我可以在 case 语句中进行某种正则表达式匹配或对错误字符串进行子切片,但这感觉是解决此问题的一种非常糟糕的方法。有什么建议?一定有一种惯用的方法来捕捉这样的错误吗?
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

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


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


url := "http://www.google.com"

res, err := http.Get(url)

if err != nil {

    return URLFetchError

}

然后switch变成:


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)

    }

}


查看完整回答
反对 回复 2022-03-03
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您可以实现错误接口并创建自己的错误,您可能会发现这些错误更容易处理。


对于运行时错误又名恐慌。您可以通过在您认为可能会出现恐慌的函数中包含 recover() 来恢复。它在恐慌函数返回之前被调用。


defer func() {

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

        if _, ok := r.(runtime.Error); ok {

                err = r.(error) //panic(r)

            }

            err = r.(error)

        }

    }()

}


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

添加回答

举报

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