2011-04-11 63 views
1

的區別是什麼(如果有的話),以書面形式:拋出新的異常與沒有周圍的捕獲之間的差異,並把它放在一個捕獲?

if (File.Exists(filePath)) 
    //Something 
else 
    throw new FileNotFoundException(); 

和包圍的if/else塊以上,與抓一試梅開二度。

其實,是否需要捕獲?如果是這樣,它會發生什麼?或者更好的比較是將上面的塊的if部分放在try語句中(不包含if語句)並捕獲FileNotFoundException,拋出調用堆棧(拋出)。

感謝

回答

0

通過圍繞帶有try catch的if塊意味着你將不得不處理丟失的文件,然後在catch中(請參閱@ lukas的回答)。如果你打算在這段代碼中處理丟失的文件,那麼你不需要else-throw,因爲你已經知道文件從第一個if中丟失了。另一方面,如果你想調用代碼(在調用堆棧的更高處)來處理丟失的文件,那麼在異常時傳遞該信息是可以的,但是你不想然後去包裝它一個try-catch,因爲它不會被拋出這個代碼塊。

+0

因此,在一個帶有GUI的應用程序中,我總是想拋出異常。我認爲如果有一堆代碼在基於GUI的系統上運行,而不是由用戶調用,那麼應該使用我展示的模式(try/catch,no throw;)。 – dotnetdev 2011-04-12 22:45:39

0

一個比其它更安全。

當你檢查一個文件是否存在時,沒有什麼能保證這個文件在那個方法的執行下面。

如果你用Try/Catch塊包圍它,你可以優雅地捕捉毛刺,相應地採取行動,並在Finally塊中包裝任何你想要的東西。例如,關閉文件流。

1

我沒有看到任何理由拋出異常將拋出無論如何。儘管拋出一個具有更高抽象級別的異常可能會更有用。

+0

'File.Exists()'雖然不會引發異常,但只在文件不存在時返回false。 – 2011-04-11 23:35:45

+1

我認爲他的意思是,如果你試圖訪問文件,就好像它存在。 – R0MANARMY 2011-04-11 23:37:12

+0

@Xavier - 但如果你嘗試訪問文件而不詢問File.Exists(),你會如果文件不存在(謝謝你R0MANARMY) – 2011-04-11 23:37:31

0

異常處理是應用程序關心的問題。如果您對(a)例外或(b)特定例外感興趣,那麼您使用try/catch。由於異常處理比if檢查慢很多個數量級,並且您知道該文件可能不存在,因此您可以採取性能降低或編寫您的代碼。這只是您選擇在文件不存在的情況下獲得性能的原因。

有些人說如果你能做些什麼,你應該只能捕捉一個異常,而且主要是他們是正確的,但是有一個地方我總是使用異常處理。

  • 當從一個服務返回 邊界。有時候,這是安全 相關(隱藏實現細節 ),雖然主要是爲了提高 運行時診斷
  • 當發出跨越服務 邊界的呼叫。這通常與可靠性 有關,儘管最重要的是幫助 排除故障。

當使用異常處理進行診斷時,我基本上只記錄異常並提高備份。

0

是的,需要捕獲,因爲競爭條件。其他進程/線程可以刪除/更改/移動/等。文件。你無法阻止它。

try 
{ 
    using (//your file opens here) 
    { 

    } 
} 
catch (FileNotFoundException) 
{ 
    // handle FileNotFoundException 
}