【问题标题】:detect windows errors/popups检测 Windows 错误/弹出窗口
【发布时间】:2011-05-16 15:11:40
【问题描述】:

我的应用没有涵盖所有的异常情况。在运行时,有时会弹出一个窗口,显示错误:“系统空引用异常”或“文件或目录已损坏且无法读取”。一旦错误窗口出现,它不会消失,直到用户使用按钮做出响应。

我想捕获这些异常并且不想向用户显示这些错误窗口。

【问题讨论】:

    标签: c# .net exception-handling


    【解决方案1】:

    您可以通过签署 UnhandledException 事件来捕获 AppDoamin 级别上的所有异常

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    

    【讨论】:

    • 在我看来,它捕获了来自不同线程的异常。尝试执行此操作:AppDomain.CurrentDomain.UnhandledException += (sender, e) => { MessageBox.Show(e.ExceptionObject.ToString()); }; Thread otherThread = new Thread(() => { // logic causing DivisionByZeroException int i = 0; i = i / i; }) { IsBackground = true }; otherThread.Start();
    • 如果你已经使用过 WinForms 应用程序,那么可以使用以下方法:Application.ThreadException += new Application_ThreadException;
    【解决方案2】:

    您需要将代码包装在 try {} catch(Exception e) {} 块中,以便您自己捕获错误。

    示例:

    try
    {
      // all of my code
    }
    catch ( Exception e )
    {
      // show my own error dialog
    }
    

    【讨论】:

      【解决方案3】:

      听起来您需要回顾一下您的代码并查看您的异常处理。要么有部分代码不在 try/catch 块内,要么有一些 try/catch 块不能处理所有可能的异常。

      您需要确保当您使用 try/catch 块包装这些代码部分时,您不仅会吃掉错误,还会记录它们。您不希望您的应用程序出现意外错误而没有发生任何事情,因为这些意外错误会使您的应用程序处于易受攻击的状态。有时,让您的应用程序崩溃比隐藏这些错误更好。

      这是一篇关于使用try/catch的好文章:

      http://msdn.microsoft.com/en-us/library/ms173160.aspx

      当您实现try/catch 时,请确保您还考虑放入finally 以清理任何连接信息或其他应关闭的代码。它看起来像这样:

      try
      {
         //Your existing code
      }
      catch (Exception ex)
      {
         //Here is where you log the error - ex contains your entire exception so use that in the log
      }
      finally
      {
         //Clean up any open connections, etc. here
      }
      

      请注意,catch 块会捕获通用的Exception,因此上面(在更具体的 catch 块中)未捕获的所有错误都应在此处捕获。

      【讨论】:

        【解决方案4】:

        尝试将所有MessageBox.Show() 语句替换为Logger.LogInfo(ex.Message); 之类的内容。或许可以使用Log4Net 之类的日志记录解决方案。

        【讨论】:

          猜你喜欢
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 2013-08-02
          相关资源
          最近更新 更多