React Native for Windows原生模块异常无法被全局捕获该如何处理
React Native for Windows原生模块默认不会把执行时抛出的异常冒泡到应用全局的App.UnhandledException和TaskScheduler.UnobservedTaskException管道,原生层会默认捕获异常并传递到JS层,你可以通过以下几种方式实现异常捕获:
方案1:原生模块内显式捕获处理(最推荐)
直接在原生方法内加try-catch逻辑,既可以本地记录异常,也可以将异常回传给JS层处理。
修改后的CustomModule.cs代码:
using Microsoft.ReactNative.Managed; using System; using System.Diagnostics; namespace testprojecthandlederrors { [ReactModule] class CustomModule { [ReactMethod("saveImage")] public void SaveImage(string base64, IReactPromise<string> promise) { try { // 原有业务逻辑 var base64String = base64.Replace("data:image/png;base64,", string.Empty); promise.Resolve("处理成功"); } catch (Exception ex) { // 本地记录异常日志 Debug.WriteLine($"原生模块异常:{ex.Message}"); // 将异常传递到JS层处理 promise.Reject(new ReactError { Message = ex.Message, Code = "NATIVE_ERROR" }); } } } }
对应App.js的调用逻辑调整:
... const testException = async () => { try { await NativeModules.CustomModule.saveImage(); } catch (e) { console.log('捕获到原生模块异常:', e); } } ...
方案2:全局拦截所有原生模块异常
如果不想给每个原生方法单独加捕获逻辑,可以注册React Native实例的全局异常回调,统一处理所有原生模块异常。
在App.xaml.cs的构造函数中新增如下代码:
InstanceSettings.OnInstanceCreated += (sender, instance) => { instance.NativeModuleException += (s, e) => { // 统一捕获所有原生模块抛出的未处理异常 Debug.WriteLine($"全局捕获原生模块异常:{e.Exception.Message},所属模块:{e.ModuleName},调用方法:{e.MethodName}"); // 如果需要让异常继续冒泡到你之前注册的App_UnhandledException,将e.Handled设为false即可,默认值为true e.Handled = false; }; };
方案3:处理异步Task未观测异常
如果你的原生模块内存在未被await的异步Task抛出的异常,除了原有TaskScheduler.UnobservedTaskException注册逻辑外,还需要在项目的.csproj配置文件的PropertyGroup节点中新增配置,开启未观测异常上报:
<ThrowUnobservedTaskExceptions>true</ThrowUnobservedTaskExceptions>
内容的提问来源于stack exchange,提问作者David Medina
相关产品推荐
相关产品推荐

