React Native SQLite错误捕获疑问:为何代码未触发任何提示?
你的错误捕获逻辑确实存在问题,这就是为什么你没收到任何提示的原因
嘿,我来帮你拆解一下代码里的问题:
主要的错误捕获漏洞
RNFetchBlob.fetch的错误完全没被捕获:你现在的.catch只挂在了tx.executeSql后面,但fetch过程中如果出现网络失败、请求返回错误码(比如404/500)这些情况,根本不会触发任何错误提示,因为这部分Promise链没有对应的错误处理。tx.executeSql的.catch无效:tx.executeSql是基于回调的API,它并不返回Promise,所以你在它后面加的.catch永远不会被执行,等于白加了。- 数据库事务的错误没被正确监听:
db.transaction本身有专门的错误回调参数,你没有利用它来捕获事务执行过程中的问题(比如SQL语法错误、数据库连接异常)。
另外还有个小问题:你直接把res(RNFetchBlob的响应对象)赋值给sql变量,这肯定不对,你需要先把响应内容转换成文本,比如用res.text()来获取实际的SQL语句,否则把对象当SQL执行肯定会出错,这也可能是没提示的隐藏原因。
修正后的代码示例
let dirs = RNFetchBlob.fs.dirs; RNFetchBlob.config({ fileCache: false }) // 发起网络请求 .fetch('GET', 'https://URL_WITH_QUERY_TEXT') // 先解析响应为文本(获取SQL内容) .then((res) => res.text()) // 执行数据库事务 .then((sql) => { db.transaction( // 事务内的操作 (tx) => { tx.executeSql(sql, [], (tx, results) => { alert('OK!'); }); }, // 事务错误回调:捕获SQL执行、事务本身的错误 (error) => { alert(`事务执行出错:${error.message}`); return true; // 返回true可阻止自动回滚,按需选择 }, // 事务成功完成的回调(可选) () => { console.log('事务执行完成'); } ); }) // 捕获网络请求、响应解析过程中的所有错误 .catch((error) => { alert(`请求或解析出错:${error.message}`); });
修正后的错误捕获逻辑说明
- 最外层的
.catch:负责处理RNFetchBlob.fetch的网络错误、请求失败,以及res.text()的解析错误。 db.transaction的错误回调参数:专门捕获数据库事务执行过程中的所有问题,包括tx.executeSql的SQL语法错误、数据库操作失败等。- 移除了无效的
tx.executeSql后面的.catch,改用事务本身的错误回调来处理数据库相关错误。
这样调整后,不管是网络请求阶段还是数据库操作阶段出错,你都会收到对应的错误提示了。
内容的提问来源于stack exchange,提问作者Italo Rodrigo
相关产品推荐
相关产品推荐

