2014-10-07 64 views
0

如果您在using語句中實例化某些內容,而不是捕獲任何異常並跳過代碼塊,那麼我正在閱讀here。我仍然看到未處理的異常發生了一些不屬於此找到文件:使用語句的未處理異常

 using (TextReader sv = File.OpenText(@"sv\.sv")) 
     { 
      char[] k = { ':' }; 
      lastWsp = sv.ReadLine().Split(k)[1]; 
     } 

我誤解MSDN文章或者我需要設置在編譯器開關?

+0

你能否複製一下你認爲是這樣的部分? – 2014-10-07 15:33:15

+2

來自文檔:「使用語句可確保在調用對象**上的方法時即使發生異常**也會調用Dispose。」使用不會處理實例化對象時發生的任何異常。 – 2014-10-07 15:34:11

+0

@ChrisDunaway嘗試從方法中拋出異常並將其從使用中調用。 – 2014-10-07 15:35:16

回答

4

using轉化爲try-finally塊,它沒有catch,所以你誤解了文章。它不會catch任何異常,它只會確保在發生異常時處理該對象。

在你的情況下,因爲它是一個FileNotFound異常,你的對象將不會被初始化。

您的代碼將轉化爲類似:

{ 
    TextReader sv = null; 
    try 
    { 
     sv = File.OpenText(@"sv\.sv"); 
     char[] k = { ':' }; 
     lastWsp = sv.ReadLine().Split(k)[1]; 
    } 
    finally 
    { 

     if(sv != null) 
      sv.Dispose(); 
    } 
} 

在上面的代碼中的異常情況下,它會嘗試處理您的對象sv。但例外將保持未處理

因爲在你的代碼中,例外的是FileNotFound你的對象sv將保持空(初始化),因此也就沒有理由罵Dispose。但想象一下,如果您有有效的文件路徑,並且您在sv.ReadLine().Split(k)[1];處遇到異常,那麼它將處置您的TextReadersv,並且該異常會在層次結構中向上傳播,因爲沒有catch塊。

5

是的,你誤解了這篇文章。

using聲明資源將以Dispose關閉,無論該塊內是否引發任何異常。它不會爲你找到例外。

2

MSDN文章說,即使異常是從使用塊內引發的,您可以保證將調用.Dispose(),在您的情況下,對象sv。這就是所有它說,在除此之外,您將得到關於如何實現的說明,使用tryfinally

可以實現通過將對象try塊內,然後調用Dispose在相同的結果最後一塊

所以看來你誤解了文章。