2010-09-23 27 views
0

我正在開發一個刮取一個網頁鏈接的刮板,然後創建執行 刮取子頁面的線程。WebClient.OpenRead異常:「值不能爲空。」

這是一個線程做什麼:

Dim client As New WebClient() 
Dim stream As Stream = client.OpenRead(_Address) 
Dim streamReader As New StreamReader(stream, True) 
_Content = streamReader.ReadToEnd() 
streamReader.Close() 
streamReader.Dispose() 
stream.Close() 
stream.Dispose() 
client.Dispose() 

我注意到,有時(通常是因爲運行多個併發線程),一個線程拋出異常。它隨機發生,例外情況發生在client.OpenRead,它說"Value cannot be null. Parameter name: address"。我也有一個try..catch在這裏,所以我把一個斷點在catch塊,它似乎_Address是有效的,但代碼拋出一個異常。

_Address是一個受保護的類字段,不能被其他線程訪問。

的確切消息是:

「值不能爲空參數名:地址」。

例外是System.ArgumentNullException

堆棧跟蹤是:

在System.Net.WebClient.OpenRead(字符串地址)在MyAppName.Scraper.Scrape()在MyAppFolder \ Scraper.vb:行96

待辦事項你有任何建議來解決這個問題? 預先感謝您。

+0

您是否在靜態(模塊/共享)類/方法中使用此代碼? – Oded 2010-09-23 13:31:40

+0

發佈錯誤消息和stacktrace將是一個好主意。而且由於它是關於_Address,它從何而來? – 2010-09-23 13:36:10

+0

@Oded不,公共類中的方法內的代碼。 – 2010-09-23 13:54:49

回答

2

WebClient.OpenRead(string address)內部實現就是:

public Stream OpenRead(string address) 
{ 
    if (address == null) 
    { 
     throw new ArgumentNullException("address"); 
    } 
    return this.OpenRead(this.GetUri(address)); 
} 

所以_Address當它被傳遞必須爲空

也許嘗試這樣的事情:

private string _address; 
private string _Address 
{ 
    get 
    { 
     if(_address == null) 
      throw new ArgumentNullException("_Address was never set and is still null!"); 
     return _address; 
    } 
    set 
    { 
     if(value == null) 
      throw new ArgumentNullException("_Address can not be null!"); 
     _address = value; 
    } 
} 

所以基本上如果有些東西試圖將_Address設置爲null,當它發生時你會得到一個錯誤,並且可以在調用堆棧中看到它被設置的位置爲空。

+0

我投了票,因爲這是我會做的:檢查空值,並立即拋出異常或依靠默認值,如果邏輯指示這樣做。只是爲了未來curtsey,請在發佈之前(轉換器)轉換爲VB.NET,因爲它被標記爲'VB.NET'。謝謝。 – atconway 2010-09-29 21:07:03

相關問題