2014-07-22 37 views
2

我有一個服務器,我正在寫,我想處理來自conn.Read()的錯誤。具體來說,我不想在客戶端關閉連接的情況下做任何事情,但如果有任何其他錯誤,則記錄錯誤。我遇到了以下問題:如何檢查Go中的特定網絡錯誤?

  1. 該文檔似乎沒有說出conn.Read()可能返回的錯誤。
  2. 連接關閉的客戶端似乎是一個EOF錯誤。原來,它的類型是error.errorString。真的嗎?

所以基本上我必須做一個字符串比較「EOF」來告訴我的錯誤是預期的還是真正的錯誤?!?我錯過了什麼嗎?因爲這似乎是目前一個巨大的監督......

回答

2

哦,不,這是因爲string作爲it's defined

import "errors" 
... 
var EOF = errors.New("EOF") 

,什麼errors.New(string)回報確實是一個類型轉換爲string,因爲這種類型的,errorString僅僅嵌入您傳遞給error.New(string)的字符串,其唯一目的是定義其上的Error() string方法—以滿足error接口。

但是你測試此特定錯誤(文件末尾)是這樣的:

import "io" 
... 
if err == io.EOF { 
... 

也就是說,你不比較字符串,而是由一定的庫模塊導出一個衆所周知的變量,而地址(在這種情況下爲「io」)。

+0

啊,優秀!那麼我怎麼會發現我想檢查的錯誤是io.EOF而不詢問StackOverflow?我認爲我錯過了文檔中的某些內容? – prewett

+0

爲了澄清,我假設文檔中有某些東西我錯過了某處,會指向我看看io包,即使我沒有使用io的任何函數? – prewett

+0

@prewett,好吧,我恐怕確實沒有明顯的聯繫,或者它對於某些思維方式的人來說顯而易見 - 讓我解釋一下。 Go是非常正交和最小的,所以實際上stdlib中讀取字節的所有類型都滿足'io.Reader'接口,並且一旦你知道了這個想法,就可以使用實現一個類型的Read()方法字節的TCP流返回什麼'io.Reader.Read()'被定義爲在遇到EOF時返回是不言而喻的。 – kostix