第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

解讀 Golang 錯誤代碼

解讀 Golang 錯誤代碼

Go
拉風(fēng)的咖菲貓 2022-03-03 15:12:37
因此,我看到的大多數(shù) 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 一直在變化)。現(xiàn)在也許我可以在 case 語句中進(jìn)行某種正則表達(dá)式匹配或?qū)﹀e誤字符串進(jìn)行子切片,但這感覺是解決此問題的一種非常糟糕的方法。有什么建議?一定有一種慣用的方法來捕捉這樣的錯誤嗎?
查看完整描述

2 回答

?
長風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗 獲得超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")

如果您想通過錯誤傳遞更多信息,您可以創(chuàng)建自己的自定義錯誤:


type MyError struct {

    URL string

}


func (e MyError) Error() string {

    return fmt.Sprintf("Error getting: %v", e.URL)

}

然后,您可以在需要時創(chuàng)建此錯誤。例如:


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

res, err := http.Get(url)

if err != nil {

    return MyError{url}

}

最后,在您的錯誤檢查方法中,您可以使用類型開關(guān)而不是簡單開關(guān)來獲取錯誤:


switch err.(type) {

case MyError:

    fmt.Println("Error:", err)

default:

    fmt.Println("No Error")

}

在您的情況下,由于您混合了常規(guī)錯誤,因此可以將此檢查包含在嵌套中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)

    }

}


查看完整回答
反對 回復(fù) 2022-03-03
?
繁花不似錦

TA貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊

您可以實現(xiàn)錯誤接口并創(chuàng)建自己的錯誤,您可能會發(fā)現(xiàn)這些錯誤更容易處理。


對于運(yùn)行時錯誤又名恐慌。您可以通過在您認(rèn)為可能會出現(xiàn)恐慌的函數(shù)中包含 recover() 來恢復(fù)。它在恐慌函數(shù)返回之前被調(diào)用。


defer func() {

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

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

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

            }

            err = r.(error)

        }

    }()

}


查看完整回答
反對 回復(fù) 2022-03-03
  • 2 回答
  • 0 關(guān)注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號