.NET MAUI C#应用程序中如何捕获未处理异常?
在MAUI项目(Windows/Android)中捕获未处理异常的方案
一、MAUI跨平台核心异常捕获
MAUI内置了UnhandledException事件,可覆盖大部分UI线程及部分后台异常,在App.xaml.cs中注册即可:
public partial class App : Application { public App() { InitializeComponent(); // 注册MAUI全局未处理异常事件 UnhandledException += App_UnhandledException; } private void App_UnhandledException(object sender, Microsoft.Maui.Controls.UnhandledExceptionEventArgs e) { // 执行异常日志记录、告警等操作 Console.WriteLine($"MAUI未处理异常: {e.Exception.Message}"); // 标记异常已处理,可阻止应用崩溃(按需选择) e.Handled = true; } }
二、后台任务未处理异常捕获
针对Task中未被观察到的异常,需结合TaskScheduler.UnobservedTaskException与AppDomain.CurrentDomain.UnhandledException,要在应用启动初期完成注册:
public App() { InitializeComponent(); // 注册任务调度器未观察异常事件 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; // 注册AppDomain层面未处理异常事件 AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; UnhandledException += App_UnhandledException; } private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) { Console.WriteLine($"未观察到的任务异常: {e.Exception.InnerException?.Message ?? e.Exception.Message}"); // 标记异常已被观察,避免触发应用崩溃(按需选择) e.SetObserved(); } private void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e) { var exception = e.ExceptionObject as Exception; Console.WriteLine($"AppDomain未处理异常: {exception?.Message ?? "未知异常"}"); }
说明:
Task中被await但未捕获的异常,会被MAUI的UnhandledException捕获;只有任务未被await且异常未处理时,才会触发UnobservedTaskException,该异常通常在垃圾回收时才会被检测到,测试时可手动调用GC.Collect()触发。
三、平台特定补充配置
Android平台
在Platforms/Android/MainActivity.cs中注册Android原生异常处理,覆盖底层系统级异常:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 注册Android原生未处理异常事件 Android.Runtime.AndroidEnvironment.UnhandledExceptionRaiser += AndroidEnvironment_UnhandledExceptionRaiser; } private void AndroidEnvironment_UnhandledExceptionRaiser(object sender, Android.Runtime.RaiseThrowableEventArgs e) { Console.WriteLine($"Android原生未处理异常: {e.Throwable.Message}"); e.Handled = true; }
Windows平台
在Platforms/Windows/App.xaml.cs中注册WinUI调度器异常,捕获UI线程底层未处理异常:
protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); // 注册WinUI调度器未处理异常事件 Microsoft.UI.Xaml.Window.Current.Dispatcher.UnhandledException += Dispatcher_UnhandledException; } private void Dispatcher_UnhandledException(object sender, Microsoft.UI.Xaml.DispatcherUnhandledExceptionEventArgs e) { Console.WriteLine($"Windows调度器未处理异常: {e.Exception.Message}"); e.Handled = true; }
四、测试验证
可通过以下代码触发异常,验证捕获逻辑:
// UI线程异常测试 throw new Exception("UI线程未处理异常"); // 后台任务未观察异常测试 _ = Task.Run(() => { throw new Exception("后台任务未观察异常"); });
内容的提问来源于stack exchange,提问作者user7421317
相关产品推荐
相关产品推荐

