2012-03-02 59 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以不显眼的方式记录服务器异常客户端。