当前位置: 首页 > news >正文

【MAUI】在 .NET MAUI 中实现全局异常捕获的完整指南

文章目录

        • 一、核心方法
        • 二、平台适配技巧
        • 三、进阶实践
        • 四、注意事项

在这里插入图片描述

.NET MAUI 是 .NET 跨平台原生 UI 的未来,将成为 .NET的一部分… 在 .NET MAUI 开发中,全局异常捕获是提升应用稳定性的关键。以下基于 .NET MAUI 官方实践,提供完整实现方案:


一、核心方法

通过重写 Application 类方法实现跨平台异常捕获:

// App.xaml.cs
public partial class App : Application
{public App(){InitializeComponent();MainPage = new MainPage();// 注册全局异常处理器AppDomain.CurrentDomain.UnhandledException += (sender, args) => {var ex = (Exception)args.ExceptionObject;HandleException(ex);};}private void HandleException(Exception ex){// 实现异常处理逻辑Console.WriteLine($"全局异常: {ex.Message}");// 可选:记录日志、通知用户或上报服务端#if DEBUGApplication.Current?.MainPage?.DisplayAlert("错误", ex.Message, "确定");#endif}
}

二、平台适配技巧
  1. Android 特殊处理
    Platforms/Android/MainApplication.cs 添加:

    AndroidEnvironment.UnhandledExceptionRaiser += (sender, args) => 
    {Console.WriteLine($"Android 环境异常: {args.Exception}");args.Handled = true; // 阻止应用崩溃
    };
    
  2. iOS/macOS 优化
    通过 NSSetUncaughtExceptionHandler 捕获原生异常:

    #if IOS || MACCATALYST
    ObjCRuntime.Runtime.MarshalManagedException += (_, e) => 
    {Console.WriteLine($"Apple 平台异常: {e.Exception}");e.ExceptionMode = ObjCRuntime.MarshalManagedExceptionMode.Disable;
    };
    #endif
    
  3. Windows

#elif WINDOWS// For WinUI 3://// * Exceptions on background threads are caught by AppDomain.CurrentDomain.UnhandledException,//   not by Microsoft.UI.Xaml.Application.Current.UnhandledException//   See: https://github.com/microsoft/microsoft-ui-xaml/issues/5221//// * Exceptions caught by Microsoft.UI.Xaml.Application.Current.UnhandledException have details removed,//   but that can be worked around by saved by trapping first chance exceptions//   See: https://github.com/microsoft/microsoft-ui-xaml/issues/7160//Microsoft.UI.Xaml.Application.Current.UnhandledException += (sender, args) =>{var exception = args.Exception;if (exception.StackTrace is null){exception = _lastFirstChanceException;}UnhandledException?.Invoke(sender,"Microsoft.UI.Xaml.Application.Current.UnhandledException", new UnhandledExceptionEventArgs(exception, true));};
#endif

三、进阶实践
  1. 与日志系统集成
    结合 Microsoft.Extensions.Logging 记录异常:

    private void HandleException(Exception ex)
    {var logger = Handler.MauiContext.Services.GetService<ILogger<App>>();logger?.LogError(ex, "全局异常捕获");
    }
    
  2. 错误上报服务
    异步上报到后端:

    _ = Task.Run(async () => 
    {await MyErrorReportingService.ReportAsync(ex);
    });
    
  3. 用户友好提示
    在主线程显示弹窗:

    MainThread.BeginInvokeOnMainThread(() => 
    {MainPage?.DisplayAlert("系统错误", "已记录问题,请重试", "确定");
    });
    

四、注意事项
  1. 作用范围

    • OnUnhandledException:捕获 UI 线程异常
    • AppDomain.UnhandledException:捕获后台线程异常
    • 无法捕获原生崩溃(需平台特定工具)
  2. 调试模式差异
    DEBUG 环境下建议显示详细错误,RELEASE 下隐藏技术细节:

    #if RELEASE
    string message = "操作失败,请联系支持";
    #else
    string message = ex.ToString();
    #endif
    
  3. 性能影响
    避免在异常处理器中执行耗时操作,建议异步处理日志/上报逻辑。

参考官方路线图:.NET MAUI 在 .NET 7 中已正式支持全局异常处理机制。


相关问题

  1. 如何将 .NET MAUI 异常日志保存到本地文件?
  2. 在 Android/iOS 上捕获原生崩溃有哪些方案?
  3. .NET MAUI 的异常处理机制与 Xamarin.Forms 有何区别?
http://www.lryc.cn/news/618638.html

相关文章:

  • 全国产飞腾d2000+复旦微690t信号处理模块
  • 「ECG信号处理——(23)基于ECG和PPG信号的血压预测」2025年8月12日
  • Android领域驱动设计与分层架构实践
  • 【Unity3D实例-功能-下蹲】角色下蹲(二)穿越隧道
  • 【vue(二)Vuex】
  • 解决微前端子应用嵌入后样式被覆盖
  • C++11语法(2)
  • python判断当天是否是当月最后一天
  • Python 常用的正则表达式
  • 未解决|服务的注册与发现|一个api怎么调用到另一个服务的API
  • Spring Boot部署万亿参数模型推理方案(深度解析)
  • gpt-5与gpt-5-fast
  • SQL 与 NoSQL 的核心区别
  • 力扣-739.每日温度
  • 高效解耦:自定义内核链表实现指南(简化版)
  • Java进阶学习之不可变集合
  • 数据分析学习总结之实例练习(双十一淘宝美妆)
  • 非凸科技受邀参加Community Over Code Asia 2025 Rust分论坛
  • C#教程之NPOI读写excel文件XLS,XLSX格式
  • FPGA自学——FIFO缓存器
  • VisionPro——1.VP与C#联合
  • 初识数据结构——优先级队列(堆!堆!堆!)
  • 模板打印技术——Office XLS 打印模板:为政务土地确权定制的纸张替换利器—仙盟创梦IDE
  • LE AUDIO---Volume Control Service
  • Kimi K2 架构深度解析:万亿MoE模型的效率革命与智能体突破
  • 用STM32单片机控制支持正反转的电调
  • 1、JVM内存模型剖析及优化
  • Altium Designer 22使用笔记(6)---板框导入、自绘板框、原点设置
  • 荣耀手机无法连接win11电脑,错误消息:“无法在此设备上加载驱动程序 (hn_usbccgpfilter.sys)。”解决方案
  • 【Linux】Ext系列文件系统