处理Winforms中的所有线程异常

时间:2017-01-11 09:24:48

标签: c# multithreading winforms

我有以下测试代码,

 private void button3_Click(object sender, EventArgs e)
    {
        Thread obj = new Thread(exception);
        obj.Start();
    }
    void exception()
    {
        try
        {
            int i = 0;
            int k = i / i;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void button4_Click(object sender, EventArgs e)
    {
        int i = 0;
        int k = i / i;
    }

我的主要代码是这样的

 [STAThread]
    static void Main()
    {
        Application.ThreadException += Form1_UIThreadException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

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

    private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs e)
    {
        MessageBox.Show("Exception");
    }

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
       // MessageBox.Show("Exception UI");
    }

即使我已经处理了异常应用程序崩溃线程异常。

我是否需要对句柄线程异常进行任何修正?

1 个答案:

答案 0 :(得分:1)

您无法处理未处理的CurrentDomain异常,并在您处理完该程序后继续该程序。

当引发UnhandledException事件时,UI线程的堆栈已经解开得太远,无法让程序继续。

正如AppDomain.UnhandledException所述的文档:

  

它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。

如果您在收到活动通知时检查e.IsTerminating的值,则会看到它true

您唯一的办法就是处理按钮处理程序中的异常。

请注意,在ThreadException被捕获之后程序可以继续的原因是只有该线程的堆栈已被解开,这不会(直接)影响UI线程。