C# 在Winforms中处理所有线程异常

C# 在Winforms中处理所有线程异常,c#,multithreading,winforms,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; }

我有以下测试代码

 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");
    }
即使我已经处理了这两个异常,应用程序也会因线程异常而崩溃


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

您不能处理未处理的CurrentDomain异常,并在处理后让程序继续运行

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

作为各国的文件:

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

如果在收到事件通知时检查
e.IsTerminating
的值,您将看到它是
true

您唯一的方法是在按钮处理程序中处理异常

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

可能“要捕获非Windows窗体创建和拥有的线程中发生的异常,请使用UnhandledException事件处理程序。”