MessageBox未显示"未处理的异常"在winforms中触发

时间:2012-02-08 11:39:16

标签: winforms exception handler messagebox

所以我试图在我的应用程序中添加“AppDomain.CurrentDomain.UnhandledException”处理程序,如果我将错误记录到文本文件中,它就可以了。但是当我尝试使用MessageBox时,它永远不会弹出。它是.Net中的另一个错误吗?任何想法?

这是我的代码示例:

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

   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new Form1());

这是我的处理程序方法:

static void CurrentDomain_UnhandledException (object sender, UnhandledExceptionEventArgs e)
{
    try
    {
       Exception ex = (Exception)e.ExceptionObject;

       MessageBox.Show("Whoops! Please contact the developers with "
                   + "the following information:\r\n\r\n" + ex.Message + ex.StackTrace,
                   "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);

    }
    finally
    {
       Application.Exit();
    }
}

编辑:我已经尝试了所有可能的选项,但我仍然看不到MessageBox。现在的问题是,当我从Visual C#(调试模式)运行它时,它完美地显示了该框。但是当我直接从调试/发布文件夹运行应用程序时,它没有显示MessageBox,并且应用程序继续运行,就像没有发生错误...

2 个答案:

答案 0 :(得分:1)

这种情况可能是因为Unhandled Exceptions导致应用程序以静默方式终止,UnhandledExceptionEventHandler处理非UI线程异常。

请参阅Application.SetUnhandledExceptionMode方法,AppDomain.UnhandledException事件和Application.ThreadException事件

修改 尝试按照第一个链接设置Application.SetUnhandledExceptionMode

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //add this line

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);    
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

答案 1 :(得分:1)

此示例适用于调试模式和发布模式,不论是否为vs2010:

using System;
using System.Windows.Forms;

namespace WinFormsStackOverflowSpielWiese
{
  internal static class Program
  {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    private static void Main() {
      System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
      System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }

    private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
      try {
        var exception = e.Exception != null ? e.Exception.Message + e.Exception.StackTrace : string.Empty;
        MessageBox.Show("Whoops! Please contact the developers with the following information:\r\n\r\n" + exception,
                        "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
      }
      finally {
        Application.Exit();
      }
    }

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
      try {
        var exception = e.ExceptionObject is Exception ? ((Exception)e.ExceptionObject).Message + ((Exception)e.ExceptionObject).StackTrace : string.Empty;
        MessageBox.Show("Whoops! Please contact the developers with the following information:\r\n\r\n" + exception,
                        "Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
      }
      finally {
        Application.Exit();
      }
    }
  }
}

表单的代码

编辑现在有一个计时器,结果相同....

using System.Windows.Forms;

namespace WinFormsStackOverflowSpielWiese
{
  public partial class Form1 : Form
  {
    private System.Threading.Timer myTimer;

    public Form1() {
      this.InitializeComponent();

      this.myTimer = new System.Threading.Timer(state =>
                                                  {
                                                    var i = 0;
                                                    var s = 100 / i;
                                                  }
                                                , null, 5000, 5000);
    }
  }
}