如何捕捉异常

Mit*_*ité 5 c# wcf exception-handling

这是我的第一个正确处理异常的应用程序.这是一个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();
Run Code Online (Sandbox Code Playgroud)

在此代码中,可能会发生一些例外情况.比如NullReferenceException.我如何知道哪个对象导致了异常,因此我可以知道在catch中要做什么以及返回到客户端的内容?

Joh*_*ers 9

一般来说,你不应该抓住任何例外.

我知道这听起来很奇怪,但事实是,你应该只捕获异常,你其实可以一些事情,和你平时不能做任何的异常.

此规则的"例外"与"处理"异常的含义有关.在某些应用程序中,"处理"异常意味着记录它.在其他(例如ASP.NET)中,最好处理异常,因为框架(在本例中为ASP.NET Health Monitoring)将为您记录它.

在事件驱动的代码中,比如Windows Forms,我发现有必要在事件处理程序中捕获异常.至少在早期版本的.NET中,允许异常传播到例如按钮单击事件之外会产生令人不快的结果.我通常捕获异常并在对话框中显示它.

在多层应用程序中,可以捕获层边界上的异常,然后重新抛出新的特定于层的异常:

try
{
   // ...
}
catch (Exception ex)
{
    throw new TierException("Some message", ex);
}
Run Code Online (Sandbox Code Playgroud)

另一个用例是捕获异常,然后抛出一个包含更多信息的新异常:

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

在这种情况下,您将捕获特定的异常(FileNotFoundException),并提供他们无法知道的调用方信息:未找到的文件是配置文件.

一般消息是: - 仅捕获您知道如何处理的异常 - 尽可能捕获最具体的异常 - 在创建新异常时始终包含内部异常,以保留异常链 - 要重新抛出当前异常,请使用throw;,而不是throw ex;

还有一些,我将尝试从Microsoft框架设计指南中找到您的参考.

PS如果有人能找到这个重复的问题,请随意关闭.我不介意失去任何代表.我找不到副本.


我应该刚刚发布了"异常处理" 标签wiki的链接,其中说:

但是,对于.NET程序上下文中的异常处理,请参阅" 异常设计指南 ".