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(); }
- 排查其他配置冲突:
- 调试模式下系统会优先触发异常断点,不会走自定义异常回调,建议打包为Release包验证捕获逻辑是否生效
- 如果项目集成了第三方崩溃采集SDK,这类SDK会优先接管全局异常事件,导致自定义回调收不到通知,需要把自定义异常处理逻辑放在第三方SDK注册之前
- TaskScheduler.UnobservedTaskException事件仅在异常Task被GC回收时触发,测试时可主动调用
GC.Collect(); GC.WaitForPendingFinalizers();验证该事件回调是否正常
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

