c# - 如何捕捉异常

标签 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();

在此代码中可能会发生一些异常。例如 NullReferenceException。我如何知道哪个对象导致了异常,以便我可以知道在捕获中做什么以及将什么返回给客户端?

最佳答案

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

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

此规则的“异常”与“处理”异常的含义有关。在某些应用程序中,“处理”异常意味着记录它。在其他情况下(例如 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;,而不是 throw ex;

还有一些,我会尝试从 Microsoft Framework Design Guidelines 中为您找到引用。

附言如果有人能找到这个问题的重复项,请随时将其作为重复项关闭。我不介意因此失去任何代表。我只是找不到副本。


我应该刚刚发布“异常处理”的链接 tag wiki ,它说:

However, for exception handling in the context of .NET programs, see "Design Guidelines for Exceptions".

关于c# - 如何捕捉异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526139/

相关文章:

c# - 反射和通用类型

Java 术语 : Why compile-time error and not compile-time exception?

c# - 将文本文件与 C# 中的文本模式进行比较?

c# - W10 Creators 更新后,UWP MapControl 子项不再固定定位

c# - 没有键/值文本的 POST JSON 字典

c# - XML 反序列化忽略不按字母顺序排列的属性

javascript - 飞行前响应失败,状态为 405

c++ - llvm 解释器可以处理 c++ 异常吗?

exception-handling - 你能从原始 AspectJ 抛出异常吗?

c# - 确定圆上的线段选择