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中添加的)
- 1 回答
- 0 關注
- 195 瀏覽
添加回答
舉報