Winforms应用程序在未处理的异常处理程序后仍然崩溃

 tomorrow 发布于 2023-02-11 12:13

我在测试应用程序中应用了这些处理程序:

    Application.ThreadException += Application_ThreadException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

然后我在窗体上的嵌套Task/Async await上创建一个异常:

尽管处理程序被解雇 - CurrentDomain.UnhandledException应用程序仍然崩溃.

为什么会崩溃而不显示对话框并保持运行?

System.Exception未处理消息:mscorlib.dll中出现未处理的"System.Exception"类型的异常附加信息:dd

private async void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("Main " + Thread.CurrentThread.ManagedThreadId);
    try
    {
        await Hello();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception on main  " + Thread.CurrentThread.ManagedThreadId);
    }
}

private async static Task Hello() //changed from void
{
    await Task.Run(() => new IGetRun().Run1());
}

internal class IGetRun
{
    public async Task Run1() //changed from void
    {
        Console.WriteLine("Run1 " + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(() => new IGetRun2().Run2());
    }
}

internal class IGetRun2
{
    public void Run2()
    {
        Console.WriteLine("Run2 " + Thread.CurrentThread.ManagedThreadId);
        throw new Exception("dd");
    }
}

编辑: 看起来我忘了用Task声明每个异步方法而不是void,因此异常处理现在可以预测.我唯一还不知道的是为什么 - 如果我在按钮事件中停止处理异常 - 当捕获异常时Application_ThreadException触发而不是TaskScheduler_UnobservedTaskException

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有