2012-03-02 50 views
5

這是我的第一個能正確處理異常的應用程序。這是一個WCF服務。之前所有其他的都是簡單的應用程序,只爲我自己。我對C#中的異常處理知之甚少。如何識別異常

我有這樣的代碼:

MembershipUser memUser = Membership.GetUser(username); 

DatabaseDataContext context = new DatabaseDataContext(); 
UserMembership user = UserMembership.getUserMembership(memUser); 
ItemsForUser itemUser = Helper.createItemForUser(ref item, memUser); 
Helper.setItemCreationInfo(ref item, user); 
context.Items.InsertOnSubmit(item); 
context.SubmitChanges(); 

在這段代碼有一些例外可能發生。像NullReferenceException一樣。我如何知道哪個對象導致了異常,這樣我就可以知道在catch中做什麼以及返回給客戶端的是什麼?

+0

你可能會發現這個答案和它相關的鏈接:http://stackoverflow.com/a/7152374/625332 – Dmitry 2012-03-02 01:22:25

回答

9

一般而言,您不應該捕獲的任何例外。

我知道這聽起來很奇怪,但事實是,你應該只能捕捉異常,你實際上可以做到的事情,而且你通常不能對異常做任何事情。

該規則的「例外」與「處理」例外的含義有關。在某些應用程序中,「處理」異常意味着記錄它。在其他人(例如ASP.NET)中,最好是而不是處理異常,因爲框架(本例中爲ASP.NET Health Monitoring)會爲您記錄它。

在像Windows Forms這樣的事件驅動代碼中,我發現有必要在事件處理程序中捕獲異常。至少在早期版本的.NET中,允許異常傳播到(例如)按鈕單擊事件之外會產生令人不快的結果。我通常捕獲異常並將其顯示在對話框中。

在一個多層應用程序,一個可能趕上在層級界限異常,然後重新拋出一個新的,特定層的異常:

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    throw new TierException("Some message", ex); 
} 

另一個用例是捕獲異常,則拋出一個新的異常在它的更多信息:

public int GetValueFromConfigurationFile(...) 
{ 
    const string configFileName = "..."; 
    try 
    { 
     // ... 
    } 
    catch (FileNotFoundException fEx) 
    { 
     throw new InvalidOperationException(
      String.Format("Can't find configuration file {0}", configFileName), 
      fEx); 
    } 
} 

在這種情況下,你正趕上一個特定的異常(FileNotFoundException),並提供您的來電信息,他們可能並不知道的:是未找到該文件是一個配置文件。

一般的消息是: - 只有抓住你知道如何處理 例外 - 趕上最具體的異常可能 - 創建新的異常時,保留異常 鏈始終包括內部異常 - 重新拋出目前的例外情況,使用throw;,而不是throw ex;

還有一些,我會盡力找到你從Microsoft框架設計指南的參考。

P.S.如果有人可以找到這個問題是重複的,可以隨意重複關閉。我不介意失去任何代表。我只是找不到重複。


我剛纔發佈的鏈接到「異常處理」 tag wiki,那裏說:

然而,對於.NET程序的情況下的異常處理,見 「Design Guidelines for Exceptions 」。

+0

這個答案晃動我的襪子。 – CptSupermrkt 2012-03-02 00:48:36

+0

謝謝,但它實際上不是_my_答案。我只需要找到鏈接。 – 2012-03-02 00:51:53

1

雖然WCF具有將服務器異常傳遞到客戶端的機制,但如果您的客戶端用戶確實希望通常看到複雜的服務器端異常,那麼可能值得考慮。
通常更好的是跟蹤服務器端的期望 - 如果你想遠程訪問它,那麼使用遠程跟蹤記錄器。或者在您的服務器上使用單個文本跟蹤api以不顯眼的方式記錄服務器異常客戶端。