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

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

處理網絡數據包讀取超時后的錯誤

處理網絡數據包讀取超時后的錯誤

Go
慕森卡 2022-12-19 21:34:04
我使用的conn.SetReadDeadline是設置讀取超時的方法conn,當conn.Read等待超過指定的時間就會返回并返回一個類型的錯誤*net.OpError。net在包裝所有非錯誤后,此錯誤由包返回io.EOF。我可以在用Unwrap(). 超時錯誤是 類型的錯誤*poll.DeadlineExceededError。我在我的代碼中使用這樣的語句來精確處理超時錯誤。import "internal/poll"_, err = conn.Read(p)    if err != nil {        if pe, ok := err.(*net.OpError); ok {            err = pe.Unwrap()            if timeout, ok := err.(*poll.DeadlineExceededError); ok {                log.Error(fmt.Sprintf("%T, %s", timeout, timeout))            }        }        return    }我在運行程序時收到use of internal package internal/poll not allowed錯誤消息。編譯器告訴我不能使用內部包。我用谷歌搜索并找到了刪除internal文件夾的解決方案,這是最終解決方案嗎?會有更好的解決方案嗎?
查看完整描述

1 回答

?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

該os包將該錯誤導出為os.ErrDeadlineExceeded(檢查源代碼)。你可以試試 :


if errors.Is(err, os.ErrDeadlineExceeded) {

    log.Error("Timeout error")

}

[編輯]實際上,在閱讀@Brit 的評論后,這是檢查該錯誤的記錄方式。請參閱文檔Conn.SetDeadline():


如果超過截止日期,對 Read 或 Write 或其他 I/O 方法的調用將返回一個包含 os.ErrDeadlineExceeded 的錯誤。這可以使用 errors.Is(err, os.ErrDeadlineExceeded) 進行測試。


錯誤是“超時”錯誤的另一個跡象是它是否有一個Timeout() bool方法,該方法true在調用時返回。


這是net.Error接口的一部分(雖然這個接口有一個額外的方法,它被記錄為已棄用),并由net.OpError類型(以及內部poll.DeadlineExceededError類型)實現。


有幾個函數(例如net.OpError.IsTimeout(),os.SyscallError.IsTimeout()公共函數os.IsTimeout())通過直接將錯誤值轉換為timeout接口來實現超時檢查。


如果你想處理可以被包裝成另一個的錯誤,你可能想要isTimeout()使用以下方法實現你自己的檢查errors.As(...):


// isTimeout : use errors.As() to unwrap errors and check if a sub error is a Timeout error

func isTimeout(err error) bool {

    var terr interface{ Timeout() bool }

    return errors.As(err, &terr) && terr.Timeout()

}

https://go.dev/play/p/OhhKY3XsGjZ


注意 :


isTimeout()上面的函數和調用之間的區別在于errors.Is(err, os.ErrDeadlineExceeded)后者將嘗試完全匹配一個ErrDeadlineExceeded(這主要是通過設置SetDeadline()一些類似文件或連接的對象來觸發的),而后者可能會為嘗試匹配的錯誤返回 true出于其他原因宣傳“我是超時錯誤”(例如:HTTP“408 請求超時”響應)


注:以上所有鏈接均參考go 1.18.3。根據您使用的 go 版本,您可能需要調整上面的一些代碼(例如:os.ErrDeadlineExceeded在go1.15中添加的)


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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