性夜影院午夜看片,无码精品久久一区二区三区,婷婷成人丁香五月综合激情,校园春色 qvod,性调教室高h学校

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

Go語言集成了簡單易用的網(wǎng)路庫,今天的推送是一線架構(gòu)師分享的Go網(wǎng)絡(luò)庫使用入門指南。

Go 自帶的網(wǎng)絡(luò)標(biāo)準(zhǔn)庫可能讓很多第一次使用它的人感慨,這個(gè)庫讓網(wǎng)絡(luò)編程的門檻低到了令人發(fā)指的地步。然而,封裝層次與開發(fā)人員的可控性往往是矛盾的。Go 的網(wǎng)絡(luò)庫封裝程度算是一個(gè)不錯(cuò)的折衷,絕大部分時(shí)候,我們只需要調(diào)用 Dial, Read, Write Close 幾個(gè)基本操作就可以了。

但是,網(wǎng)絡(luò)是復(fù)雜的。我們有時(shí)候需要細(xì)致的處理網(wǎng)絡(luò)中的各種錯(cuò)誤,根據(jù)不同的錯(cuò)誤進(jìn)行不同的處理。比如我們遇到一個(gè)網(wǎng)絡(luò)錯(cuò)誤時(shí),需要區(qū)分這個(gè)錯(cuò)誤是因?yàn)闊o法解析 host ip, 還是 TCP 無法建立連接,亦或是讀寫超時(shí)。一開始的時(shí)候,我們的寫法可能是這樣的:

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

這種根據(jù)錯(cuò)誤信息進(jìn)行字符串匹配進(jìn)行判斷的方法有非常明顯的局限性:該錯(cuò)誤信息依賴于操作系統(tǒng),不同的操作系統(tǒng)對(duì)于同一錯(cuò)誤返回的字符串信息可能是不同的。因此,這種判斷網(wǎng)絡(luò)錯(cuò)誤類型的方法是不可靠的。那么有沒有一種準(zhǔn)確而可靠的判斷各種網(wǎng)絡(luò)錯(cuò)誤的方式呢?答案是肯定的。

我們知道在 Go 中,error 是一個(gè)內(nèi)建的 interface 類型:

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

要準(zhǔn)確判斷不同的錯(cuò)誤類型,我們只需要類型斷言出其錯(cuò)誤類型即可。

在 Go 的網(wǎng)絡(luò)標(biāo)準(zhǔn)庫中,錯(cuò)誤類型被統(tǒng)一封裝為 net.Error 的 interface 類型:

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

而 net.Error 類型的具體 concrete 類型又被封裝為 net.OpError 類型:

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

其中,net.OpError.Err 可能是以下幾種類型:

  • net.DNSError
  • net.InvalidAddrError
  • net.UnknownNetworkError
  • net.AddrError
  • net.DNSConfigError
  • *os.SyscallError

*os.SyscallError 錯(cuò)誤比較特殊,與具體操作系統(tǒng)調(diào)用有關(guān):

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

對(duì)于我們關(guān)心的網(wǎng)絡(luò)錯(cuò)誤,SyscallError.Err 一般為 sys.Errno 類型,與網(wǎng)絡(luò)錯(cuò)誤相關(guān)的常用值有:

  • syscall.ECONNREFUSED
  • syscall.ETIMEDOUT

看到這里,你可能忍不住要吐槽 Go 這種錯(cuò)誤嵌套處理了,事實(shí)上,官方也意識(shí)到了這種錯(cuò)誤處理的問題,在 Go 2中,可能會(huì)出現(xiàn)新的錯(cuò)誤和異常處理方式,可以參見 GopherChina 2018 keynote 點(diǎn)評(píng): RETHINKING ERRORS FOR GO 2 (https://liudanking.com/arch/gopherchina-2018-keynote-%E7%82%B9%E8%AF%84/).

當(dāng)前階段,我們依然要直面這種錯(cuò)誤處理方式。為了方便大家理解 Go 網(wǎng)絡(luò)標(biāo)準(zhǔn)庫中處理錯(cuò)誤的方式,我們把上面的錯(cuò)誤嵌套整理了一張關(guān)系圖:

明白了網(wǎng)絡(luò)標(biāo)準(zhǔn)庫中處理錯(cuò)誤的邏輯,判斷和識(shí)別各種類型的網(wǎng)絡(luò)錯(cuò)誤就非常簡單了:對(duì)網(wǎng)絡(luò)錯(cuò)誤進(jìn)行類型斷言。以我們團(tuán)隊(duì)主要關(guān)心的 DNS 解析錯(cuò)誤、TCP 無法建立連接、讀寫超時(shí)為例,判斷邏輯可以是這樣:

Go 中如何準(zhǔn)確地判斷和識(shí)別各種網(wǎng)絡(luò)錯(cuò)誤

這種錯(cuò)誤判定方式除了能解決最開始提到的可靠性和準(zhǔn)確性問題,也具有良好的普適性。即基于 net 的其他標(biāo)準(zhǔn)庫,如 net/http 也支持這種錯(cuò)誤判斷方式。

轉(zhuǎn)自:

liudanking.com/network/go-%e4%b8%ad%e5%a6%82%e4%bd%95%e5%87%86%e7%a1%ae%e5%9c%b0%e5%88%a4%e6%96%ad%e5%92%8c%e8%af%86%e5%88%ab%e5%90%84%e7%a7%8d%e7%bd%91%e7%bb%9c%e9%94%99%e8%af%af/

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!