2011-11-04 114 views
39

使用的缺點是什麼區別:不帶參數

catch 
{ 
    MessageBox.Show("Error."); 
} 

和:在你的第二個例子

catch (Exception ex) 
{ 
    MessageBox.Show("Error."); 
    //we never use ex, so is it better to use catch without arguments? 
} 
+0

閱讀它:http://msdn.microsoft.com/en-us/library/0/default.aspx(VS.80).aspx – JonH

+0

在第二種情況下,如果要捕獲該類型,請使用'catch(Exception)'或派生類型的例外,但不想知道細節。否則,你會得到一個警告,並在不需要的時候聲明一個變量 –

回答

52

從.NET 2開始,如果你不調整配置​​?沒有。

在此之前,或與一些配置的調整我不記得確切的說,有一個從非託管代碼沒有被轉換成Exception兼容的物體被拋出的異常的可能性。

注意,這裏就是你指定類型,但不變量之間,另一種選擇:

catch (Exception) 
{ 
    ... 
} 

個人而言,我會非常小心捕獲異常的,甚至沒有日誌它。如果你打電話給一個骨頭的API,它可能是必需的,但通常最好避免它。

+1

「有可能從非託管代碼中拋出異常,而這些異常沒有得到......」因此,從2.0開始,它將轉換爲與Exception兼容?即現在由託管或非託管引發的任何事情都將被catch(Exception e){}所捕獲。順便說一句,我曾嘗試使用Outlook互操作庫進行試驗,但不知道如何獲得legimate unmanaged code error。 – devanalyst

+1

@deanalyst:是的,我相信*現在一切都轉換爲「異常」。 –

+0

@JonSkeet:但是'catch','catch(Exception)'和'catch(Exception ex)'有什麼區別?第一個沒有什麼比捕捉所有東西,第二個只是類型,第三個也是細節?除了例外,你應該抓住什麼? – testing

3

可以參考的異常數據,如堆棧跟蹤,來源等,還給出了一個有時有用的一般信息。它告訴你爲什麼你在調試時遇到了一個非常重要的異常。

+1

我認爲你錯過了這一點,第一個捕獲所有異常,第二個捕獲.NET異常 –

+0

實際上,他們所問的只是它們之間的區別兩個例子,這就是區別。要麼你引用異常,要麼你不引用。所以你知道,這兩個例子都能捕獲所有.Net異常。你捕獲的任何異常都是「.Net異常」,因爲這是C#。同樣重要的是要注意,所有異常在其繼承樹中都有Exception類,因爲異常類必須從繼承了Exception類的另一個類繼承,直接或間接繼承它。 – jlafay

+0

你錯了,一些異常不會從異常繼承。通過用戶代碼或C#代碼創建的部分可以,但其他一些部分不需要 –

6

一般來說,你應該首先發現特定的錯誤。

但是如果你去追趕一般Exception像你這樣我會說使用第二種情況:

catch (Exception ex) 
{ 
    MessageBox.Show("Error."); 
    //we never use ex, so is it better to use catch without arguments? 
} 

這可以幫助你debbuging自變量包含堆棧跟蹤,異常消息.. 。等等。您可以使用它來記錄錯誤或者可以幫助您預防錯誤的內容。

使用這種方法,但要非常小心:

MessageBox.Show("Error."); 

沒有跟蹤你的錯誤的地方(如日誌文件)可能會導致一個非常大的混亂。

+0

無論如何都可以訪問異常數據。如果您在沒有變量的情況下進入異常,則會顯示一個符號,它會向您顯示異常數據。 – GeirGrusom

+0

@GeirGrusom - 是的,但你不能使用該信息登錄文件或我們可以? – TheBoyan

+0

@GeirGrusom當然,你可以在調試的時候看到異常,但是你沒有引用它來記錄或向用戶顯示適當的消息。 – DOK

6

我認爲他們是一樣的。但第二種情況引發了編譯器警告,因爲你聲明瞭一個你沒有使用的異常。我很喜歡第一個,因爲你明確表示你不使用這個異常。還有第三個

catch (Exception) 
{ 
    //do something 
} 

如果你想指定異常的類型,但不關心異常本身。

+0

那麼這是否意味着如果拋出異常,它仍然會進入catch塊內部,即使我們對異常沒有做任何事情? –

0

有一些例外不能是catch(Exception) catched。

在單聲道linux下的excel中,應該沒有參數就可以捕獲。

否則運行時將忽略catch(Exception)陳述。

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded. 

如果遇到這樣的問題,請嘗試去除catch語句的參數,請登錄上下文瓦爾找出錯誤原因。

P.S.我不知道如何在Windows上,Windows中運行的程序是正常的。