【问题标题】:Catching all exceptions in c#在c#中捕获所有异常
【发布时间】:2010-07-24 12:15:22
【问题描述】:

我正在用 C# 开发一个 GUI 应用程序。

这是一个多线程应用程序,我想用try/catch 语句包装所有线程(其中一些我没有打开,例如NetClient.StartDownload,这是一个非阻塞函数),以便如果抛出异常但未被捕获,我可以记录它并向基地报告。

我尝试使用 Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException,但它们似乎只能捕获 GUI 异常。

我需要其他方式来处理这个问题吗?

【问题讨论】:

    标签: c# multithreading exception


    【解决方案1】:

    每个线程中的代码都需要有一个 try-catch。异常不会跨线程编组...未处理的异常只会导致应用程序宕机。

    要捕获所有异常 - 只需使用基本异常类型。

    catch(Exception e) { // log e } 
    

    更新: 您可以查看AppDomain.UnhandledException - 处理此事件以记录任何线程上未处理的异常;但是您无法阻止应用程序停止运行。如需更多信息,请查看 http://www.albahari.com/threading/#_Introduction - 在该页面的末尾。

    【讨论】:

      【解决方案2】:

      最好的答案是:不要。操作系统中已经内置了一个用于执行此操作的系统。

      如果您让异常“冒泡”并退出程序,现代操作系统包括 Windows 错误报告,它可以让用户选择向 Microsoft 发送错误报告。 (注意:不要自动发送错误报告 - 仔细考虑有关隐私法的法律后果...)

      错误报告不仅包括异常信息和完整堆栈跟踪,还包括您进程的大部分内存,以及确切加载了哪些操作系统模块(因此您甚至可以告诉客户端是否应用了相关的 Windows 更新补丁)。它将所有这些信息包装到一个小型转储文件中(还包括一些带有附加信息的 XML 文件)。

      此错误报告已上传到 Microsoft 的服务器,因此您不必担心设置和维护“回拨”服务器。您的程序的所有错误报告都使用高级启发法分类到“桶”中,每个“桶”都包含可能由同一错误引起的报告。

      Microsoft 通过名为Winqual 的站点向您(作为软件发布者)公开所有这些信息。使用 Winqual,您可以检查所有错误报告,并使用他们的启发式分桶算法来确定哪些错误对您的客户影响最大。您还可以下载每个单独的报告以进行更详细的调查。

      如果您在组织中设置了符号服务器和源代码控制服务器(您当然应该这样做),那么您可以直接将下载的错误报告中的 minidump 加载到 Visual Studio 中,它会自动检查旧源脱离源代码控制,并允许您在程序崩溃时检查程序的确切状态。

      查找和修复错误从未如此简单。

      总而言之,您需要执行以下操作:

      1. 在您的组织中设置symbol server 和源服务器。制定发布政策,以确保所有版本在发布给客户之前都已将 source-indexed pdbs 添加到符号服务器。
      2. 使用 Winqual 建立一个帐户。您需要一个 Authenticode 代码签名证书;如果您获得了非 VeriSign 代码签名证书,那么您还必须花费 100 美元购买 VeriSign 的“组织证书”。
      3. 修改您的发布策略以包括为您的发布创建映射文件。这些映射文件会在发布版本之前上传到 Winqual。
      4. 捕获意外异常。如果您确实需要捕获它们,请务必使用 throw 而不是 throw ex 重新抛出,以便保留堆栈跟踪和原始程序状态。

      如需更多信息,我强烈推荐 John Robbins 的 Debugging .NET 2.0 Applications。尽管标题中有“2.0”,但这本书在今天仍然是完全相关的(除了唯一的源服务器示例是使用 Visual SourceSafe,这在当时还是一个完全的笑话)。如果您需要进行大量调试,另一本好书是 Advanced .NET Debugging,尽管它已经开始显示它的时代,特别是因为新的 VS2010 调试改进使得它的许多技术过时了。

      【讨论】:

        【解决方案3】:

        我们需要以尽可能小的单位捕获异常。正如 Gishu 所提到的,在许多情况下,线程中发生的异常不会传播回主线程​​。

        我曾在 WCF service unhandled exception error 写过类似经历的博客

        【讨论】:

          猜你喜欢
          • 2011-11-09
          • 1970-01-01
          • 2014-05-01
          • 2011-08-20
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 2018-11-01
          • 1970-01-01
          相关资源
          最近更新 更多