You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:33:12