MessageBox не отображается, когда в winforms срабатывает «Unhandled Exception» - PullRequest
1 голос
/ 08 февраля 2012

поэтому я пытался добавить обработчик "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 ]

1 голос
/ 08 февраля 2012

этот пример работает для меня в режиме отладки и выпуска с 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);
    }
  }
}
1 голос
/ 08 февраля 2012

Это может быть связано с тем, что Unhandled Exceptions заставляет приложение завершать работу без вывода сообщений и UnhandledExceptionEventHandler обрабатывает исключения потоков не из пользовательского интерфейса.

См. Application.SetUnhandledExceptionMode Method, 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());
...