2012-09-09 22 views
2

我猜這三部分代碼沒有區別,不是嗎?在C中捕獲和捕獲(異常e)#

try 
    { 
     // ............. 
    } 
    catch 
    { 
     // ............. 
    } 

try 
    { 
     // ............. 
    } 
    catch(Exception) 
    { 
     // ............. 
    } 

try 
{ 
    // ............. 
} 
catch(Exception e) 
{ 
    // ............. 
} 

但是我何時應該使用的第一個和當時幾乎精明 - 第二。但我希望你能說出你的想法。

回答

14

第一個也會捕獲拋出的對象,不是例外。
this can happen from non-CLS-compliant code

如果您實際上沒有使用異常變量,第二個將不會給出編譯器警告。

只有當您確實需要檢查拋出的異常(例如,記錄它)時,才應使用第三個。

+0

從.NET 2.0開始,第一個和第二個例子都是一樣的。非CLS兼容異常現在由RuntimeWrappedException包裝,該異常來自Exception。 – dbarros

-1

這取決於。我不知道前兩者有什麼區別。

如果要在catch塊中使用異常,即獲取堆棧跟蹤或其他信息,則必須使用最後一個,以便您有要引用的對象。

如果你只是拋出異常來處理別人,你不需要它。

4

這些位代碼是相當有點不同。

第一個不允許您從發生的異常中獲取任何信息。它會捕捉任何東西,但你不會有任何線索什麼被抓到。

第二個不允許你做任何事情,但至少讓你指定什麼樣的異常。在你的例子中,因爲你指示Exception,它會捕獲從Exception派生的所有內容。但它可能會被改變來微調被捕獲的東西 - 但仍然允許你對此無能爲力。

第三個讓你實際訪問異常並從中獲取信息。

+0

<<。它會抓住任何東西>>「什麼」意味着什麼? – Alexandre

+0

@AlexMaslakov我的意思是,字面上,*任何*。這是我用這個詞的原因。它甚至會捕獲非例外,如果一些non-cls兼容的代碼設法拋出一個非例外。 –

1

第三屆情況其實是這樣的:

當異常發生在你的try塊行,創建相應的異常的對象。包含(Exception e)的catch塊實際上具有Exception類變量e作爲其參數。然後將異常對象的引用複製到此引用變量。您現在可以根據您的需要使用此變量來確定引發異常的類型,例如e.message()給出與異常相關的描述。

第一個和第二個案例已被Slak解釋得很好