亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解讀 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 一直在變化)?,F在也許我可以在 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 關注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號