这是我的第一个能够正确处理异常的应用程序。这是一个 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/