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

Xamarin全局异常处理不生效,两种常用方案均无法捕获异常

Xamarin.Forms Android全局异常捕获失效解决思路
  • 首先修正事件订阅时机,所有全局异常事件必须放在Android项目MainActivity的OnCreate方法最开头,早于Xamarin.Forms.Forms.Init(this, savedInstanceState)和LoadApplication(new App())调用,否则框架初始化阶段产生的异常、框架内部拦截的异常都无法被捕获。
    示例代码:
protected override void OnCreate(Bundle savedInstanceState)
{
    // 最先注册所有异常捕获事件
    AndroidEnvironment.UnhandledExceptionRaiser += (s, e) =>
    {
        // 自定义异常处理逻辑,e.Exception为抛出的异常对象
        // 如需拦截崩溃不触发系统闪退,将e.Handled设为true即可
        e.Handled = true;
    };
    AppDomain.CurrentDomain.UnhandledException += (s, e) =>
    {
        var ex = (Exception)e.ExceptionObject;
        // 自定义异常处理逻辑
    };
    TaskScheduler.UnobservedTaskException += (s, e) =>
    {
        // 自定义未观察Task异常处理逻辑
        e.SetObserved();
    };

    // 事件注册完成后再执行框架初始化
    Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
    base.OnCreate(savedInstanceState);
}
  • 单独处理Xamarin.Forms绑定类异常,这类异常默认被Forms框架内部吞掉,上述三个全局事件都无法捕获,需要在Forms层App的构造函数中添加绑定日志监听:
public App()
{
    Xamarin.Forms.Internals.Log.Listeners.Add(new DelegateLogListener((category, message) =>
    {
        // 绑定异常的分类固定为Xamarin.Forms.Binding
        if (category == "Xamarin.Forms.Binding")
        {
            // 自定义绑定异常记录逻辑
        }
    }));
    // 剩余初始化逻辑
    InitializeComponent();
    MainPage = new MainPage();
}
  • 排查其他配置冲突:
    1. 调试模式下系统会优先触发异常断点,不会走自定义异常回调,建议打包为Release包验证捕获逻辑是否生效
    2. 如果项目集成了第三方崩溃采集SDK,这类SDK会优先接管全局异常事件,导致自定义回调收不到通知,需要把自定义异常处理逻辑放在第三方SDK注册之前
    3. TaskScheduler.UnobservedTaskException事件仅在异常Task被GC回收时触发,测试时可主动调用GC.Collect(); GC.WaitForPendingFinalizers();验证该事件回调是否正常

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:18:00