如何捕捉异常

Posted

技术标签:

【中文标题】如何捕捉异常【英文标题】:How to catch exceptions 【发布时间】:2012-03-20 12:48:37 【问题描述】:

这是我第一个可以正确处理异常的应用程序。这是一个 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 中要做什么以及要返回给客户端的内容?

【问题讨论】:

您可能会在其中找到相关的答案和链接:***.com/a/7152374/625332 【参考方案1】:

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

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

此规则的“例外”与“处理”例外的含义有关。在某些应用程序中,“处理”异常意味着记录它。在其他情况下(例如 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 框架设计指南中为您找到参考。

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


我应该刚刚发布到“异常处理”tag wiki 的链接,上面写着:

但是,对于 .NET 程序上下文中的异常处理,请参阅 “Design Guidelines for Exceptions”。

【讨论】:

谢谢,但这实际上不是 my 的答案。我只需要找到链接。【参考方案2】:

虽然 WCF 具有将服务器异常传递给客户端的机制,但如果您的客户端用户真的希望在他们的脸上看到通常复杂的服务器端异常,则可能值得考虑。 一般来说,最好跟踪服务器端的期望——如果你想远程访问它,那么使用远程跟踪记录器。或者在您的服务器上使用单个文本跟踪 API 以不显眼的方式记录服务器异常客户端。

【讨论】:

以上是关于如何捕捉异常的主要内容,如果未能解决你的问题,请参考以下文章

你如何捕捉到这个异常?

HttpClient.PostAsync 崩溃应用。如何捕捉异常?

ios的app无法捕捉js异常信息

WinForm程序全局捕捉异常处理办法

5. 全局异常捕捉

bcb 如何在DLL中捕捉系统级异常