在winforms中触发“未处理的异常”时,MessageBox不显示

nkoocmlb  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(138)

因此,我尝试将“AppDomain.CurrentDomain.UnhandledException“处理程序添加到我的应用程序中,如果我将错误记录到文本文件中,它可以正常工作。但当我尝试使用MessageBox时,它永远不会弹出。这是.Net中的另一个bug吗?有什么想法吗?
下面是我代码示例:

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,应用程序继续运行,就像没有发生任何错误一样...

3bygqnnd

3bygqnnd1#

这个例子在调试模式和发布模式下对我有效,不管是否使用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();
      }
    }
  }
}

表单的代码

EDIT现在使用计时器,结果相同....

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);
    }
  }
}
um6iljoc

um6iljoc2#

这种情况可能是因为UnhandledExceptions导致应用程序静默终止,而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());
epfja78i

epfja78i3#

有点晚到党,但没有可行的解决方案显示在这里。我补充说
应用程序.DoEvents();
就在消息框和MessageBox现在显示之前。
希望这能帮到什么人。

相关问题