C # Winforms обрабатывают необработанные исключения - PullRequest
0 голосов
/ 26 мая 2019

Я хочу перехватить все необработанные исключения в моем приложении.поэтому я использовал этот код для перехвата всех необработанных исключений:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

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

    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        SaveEx(e.Exception);
        Application.Exit();
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        SaveEx((Exception)e.ExceptionObject);
        Application.Exit();
    }

    static void SaveEx(Exception ex)
    {
        bool exists = System.IO.Directory.Exists(Path.GetDirectoryName(@"C:\AppLogs\"));

        if (!exists)
            System.IO.Directory.CreateDirectory(Path.GetDirectoryName(@"C:\AppLogs\"));


        String filePath = @"C:\AppLogs\" + DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss") + ".txt";

        String log = "===========Start=============\r\n";

        log += "Error Message: " + ex.Message + "\r\n";
        log += "Stack Trace: " + ex.StackTrace + "\r\n";

        log += "===========End=============";

        System.IO.File.WriteAllText(filePath, log);
    }
}

Я попытался поднять эти исключения с делением 0:

в главном потоке, это прекрасно работает:

int t = 0;
int r = 5 / t;

Но когда я пытаюсь сделать это внутри Thread:

 Thread thread = new Thread(delegate()
 {
      int t = 0;
      int r = 5 / t;
 });
 thread.Start();

Была вызвана функция CurrentDomain_UnhandledException, но она продолжает вызывать строку int r = 5 / t; в моем коде, поэтому у меня естьцикл исключений.Есть идеи, в чем может быть проблема?поток вызывается только один раз.

1 Ответ

1 голос
/ 27 мая 2019

Вам нужно изменить приложение UnhandledExceptionMode на UnhandledExceptionMode.CatchException чтобы все работало правильно. Microsoft уже написала очень хорошую статью об этом здесь .

Я пытался смоделировать вашу работу. Все работало хорошо, посмотрите на мой пример.

    [STAThread]
    static void Main()
    {
        // Set the unhandled exception mode to force all Windows Forms errors to go through
        // our handler.
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

        // Add the event handler for handling UI thread exceptions to the event.
        Application.ThreadException += Application_ThreadException;

        // Add the event handler for handling non-UI thread exceptions to the event. 
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

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

    private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message, "Application_ThreadException");
        Application.Exit();
    }

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        var exception = e.ExceptionObject as Exception;
        MessageBox.Show(exception.Message, "CurrentDomain_UnhandledException");
        Application.Exit();
    }

Итак, если мы вызовем исключение внутри потока, как показано ниже:

    private void button1_Click(object sender, EventArgs e)
    {
        var thread = new Thread(delegate () {
            throw new DivideByZeroException();
        });

        thread.Start();
    }
  1. button1_Click уволен.
  2. нить начинает и поднимает DividedByZeroException.
  3. CurrentDomain_UnhandledException ловит исключение, показывает сообщение и закрывает приложение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...