WinUI 3(Windows App SDK)全局异常处理方案咨询
WinUI 3 全局异常处理方案
WinUI 3(Windows App SDK)提供了多套全局异常处理机制,对应不同场景的未捕获异常:
1. UI线程未处理异常
WinUI 3的Microsoft.UI.Xaml.Application类提供了UnhandledException事件,作用和WinForms的Application.ThreadException类似,专门捕获UI线程中未被处理的异常。
在App.xaml.cs中注册并处理:
public App() { this.InitializeComponent(); // 注册UI线程异常处理事件 this.UnhandledException += App_UnhandledException; } private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledExceptionEventArgs e) { // 添加自定义处理逻辑,比如记录日志、弹窗提示用户 // 标记异常为已处理,避免应用直接崩溃 e.Handled = true; }
2. 非UI线程未捕获异常
对于后台线程(如Task、独立Thread)中未被处理的异常,需要通过以下两个事件捕获:
(1)AppDomain全局异常
捕获当前AppDomain内所有未被处理的异常(包含后台线程),但触发后应用通常会终止,无法通过代码阻止:
public App() { this.InitializeComponent(); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { var exception = e.ExceptionObject as Exception; // 记录异常信息,比如写入本地日志文件 }
(2)未观察到的Task异常
捕获Task中未被await、也未手动处理的异常:
public App() { this.InitializeComponent(); TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; } private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e) { // 遍历处理所有未观察到的异常 foreach (var ex in e.Exception.InnerExceptions) { // 日志记录逻辑 } // 标记异常为已观察,避免应用因未处理Task异常终止 e.SetObserved(); }
注意事项
UnhandledException仅覆盖UI线程异常,后台线程异常需结合AppDomain.CurrentDomain.UnhandledException和TaskScheduler.UnobservedTaskException使用。- 部分致命系统异常无法通过上述事件捕获,最终仍会导致应用崩溃,建议处理时重点记录异常堆栈信息,便于后续问题排查。
内容的提问来源于stack exchange,提问作者E. A. Bagby
相关产品推荐
相关产品推荐

