C# 如何捕获异常

C# 如何捕获异常,c#,wcf,exception-handling,C#,Wcf,Exception Handling,这是我第一个能够正确处理异常的应用程序。这是一项WCF服务。以前的所有其他应用程序都只是为我自己设计的简单应用程序。我对C#中的异常处理知之甚少 我有这样一个代码: MembershipUser memUser = Membership.GetUser(username); DatabaseDataContext context = new DatabaseDataContext(); UserMembership user = UserMembership.getUserMembership

这是我第一个能够正确处理异常的应用程序。这是一项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中要做什么,以及要返回给客户机什么

一般来说,您不应该捕获任何异常

我知道这听起来很奇怪,但事实是,你应该只捕获你实际上可以做些事情的异常,而你通常不能对异常做任何事情

此规则的“例外”与“处理”例外的含义有关。在某些应用程序中,“处理”异常意味着记录它。在其他情况下(例如ASP.NET),最好不要处理异常,因为框架(本例中为ASP.NET运行状况监视)将为您记录该异常

在事件驱动代码(如Windows窗体)中,我发现有必要在事件处理程序中捕获异常。至少在.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,而不是
抛出ex

还有一些,我将尝试从Microsoft Framework设计指南中找到参考资料

另外,如果有人能找到问题,这是一个重复的,请随意关闭作为一个重复。我不介意失去任何代表。我就是找不到复制品


我应该把链接贴到“异常处理”上,上面写着:

但是,有关.NET程序上下文中的异常处理,请参阅 “”


尽管WCF有将服务器异常传递给客户端的机制,但如果您的客户端用户真的希望看到他们脸上典型的复杂服务器端异常,则可能值得考虑。

一般来说,最好跟踪服务器端的期望-如果您希望远程访问该期望,则使用远程跟踪记录器。或者在您的服务器上安装一个文本跟踪api,以不引人注目的方式在客户端记录服务器异常。

谢谢,但实际上这不是我的答案。我只需要找到链接。你可能会发现这个答案和其中的链接相关: