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

MAUI Blazor Hybrid中如何主动抛出异常使应用崩溃以测试Crashlytics?

如何在MAUI Hybrid应用中触发可被Firebase Crashlytics捕获的致命崩溃

要绕过Blazor的ErrorBoundary和MAUI默认的异常捕获机制,需要直接在原生平台层面触发未被处理的致命异常,以下是同时支持Android和iOS的实现方案:

跨平台实现代码

首先创建一个静态工具类,封装平台特定的崩溃触发逻辑:

public static class CrashTestHelper
{
    public static void TriggerFatalCrash()
    {
#if ANDROID
        AndroidCrash();
#elif IOS
        IOSCrash();
#endif
    }

    private static void AndroidCrash()
    {
        // 使用Android原生Handler在主线程抛出Java异常,绕过C#层面处理
        var mainHandler = new Android.OS.Handler(Android.OS.Looper.MainLooper);
        mainHandler.Post(() =>
        {
            throw new Java.Lang.RuntimeException("Fatal test crash for Crashlytics");
        });
    }

    private static void IOSCrash()
    {
        // 在iOS主线程调用导出的OC方法抛出异常
        Foundation.NSThread.MainThread.PerformSelector(new ObjCRuntime.Selector("triggerCrash"), null, 0);
    }
}

iOS平台补充代码

在iOS项目的任意代码文件中添加以下扩展方法,用于导出Objective-C方法:

public static class IOSCrashExtensions
{
    [Foundation.Export("triggerCrash")]
    public static void TriggerCrash()
    {
        throw new Foundation.NSException("Fatal Crash", "Test crash for Firebase Crashlytics", null);
    }
}

使用方式

在Blazor组件或MAUI原生代码中直接调用即可触发崩溃:

// 示例:Blazor组件按钮点击事件
private void StartCrashTest()
{
    CrashTestHelper.TriggerFatalCrash();
}

原理说明

  • Android:通过原生Handler在主线程抛出Java异常,绕开MAUI的C#异常处理链,系统会将其识别为未处理的致命异常,触发应用崩溃并被Crashlytics捕获。
  • iOS:通过NSThread.PerformSelector调用导出的Objective-C方法,抛出原生NSException,这种异常不会被Blazor的ErrorBoundary或MAUI的托管异常处理捕获,直接导致应用崩溃。

注意事项

  • 确保Firebase Crashlytics已完成Android和iOS平台的集成配置。
  • 测试建议在真机或调试环境下进行,避免影响正式发布版本。
  • 若Android平台仍被MAUI全局异常处理捕获,可临时移除MAUI的异常处理器(测试后恢复):
    Android.Runtime.AndroidEnvironment.UnhandledExceptionRaiser -= MauiApplication.Current.HandleUnhandledException;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:26:23