我在测试应用程序中应用了这些处理程序:
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