2014-02-13 45 views
6

有誰能告訴我throwthrow ex之間的區別嗎? 我讀throw存儲以前的例外,沒有得到這條線。
我可以通過例子簡要介紹一下嗎?拋出和拋出前的區別c#.net

+3

http://stackoverflow.com/questions/730250/is-there-a-difference-between拋出拋出ex – Random

+0

拋出拋出拋出拋出異常導致拋出拋出異常。 – Jodrell

回答

21

是 - throw重新拋出被捕獲的異常,並保留堆棧跟蹤。 throw ex會拋出相同的異常,但會將堆棧跟蹤重置爲該方法。

除非你想重置堆棧跟蹤(即屏蔽從庫的內部運作的公共用戶),throw一般更好的選擇,因爲你可以看到異常源自哪裏。

我還要提到的是, 「直通」 catch塊:

try 
{ 
    // do stuff 
} 
catch(Exception ex) 
{ 
    throw; 
} 

是毫無意義的。這完全相同的行爲,就好像根本沒有try/catch一樣。

+3

如果在拋出之前放置了一條日誌語句,這並非毫無意義。多數民衆贊成我經常使用它。 – Evgeni

+15

@Eugene你是對的,但我沒有任何東西在扔 - 這正是我想說明的。 –

4

投擲會重新拋出原始異常;

throw ex會創建一個新的異常,所以堆棧跟蹤發生變化。通常意義不大,一般您應該只是扔,或創建一個新的異常,並拋出,如

// not a great code, demo purposes only 
try{ 
File.Read("blah"); 
} 
catch(FileNotFoundException ex){ 
throw new ConfigFileNotFoundException("Oops", ex); 
} 
+0

我不止一次使用過這種模式,「拋出新的異常......」,通常只有當我通過現有代碼繪製到角落時纔會這樣。如果我有時間/訪問權限/更改*上游*代碼的權限,我會嘗試重構,不需要這個。但是,我偶爾也會在綠地代碼中使用這種模式。 –