Node.js中try/catch为何无法捕获JSONata抛出的错误?
JSONata异步错误未被try/catch捕获的问题解决
问题原因
你的代码里,expression.evaluate(data)返回的是Promise对象,属于异步操作。外层的同步try/catch只能捕获同一执行栈里的同步错误,无法捕获异步Promise抛出的错误,所以错误直接导致程序崩溃,没走到catch块。
解决方案
方案1:给Promise添加链式catch
直接在then后面追加catch处理异步错误:
try { let data = <some JSON data here>; let expression = jsonata("rows[userID=abc123]'])"); expression.evaluate(data) .then(result => { res.send(result); }) .catch(err => { // 捕获Promise的异步错误 res.send(err); }); } catch(err) { // 处理同步错误,比如jsonata表达式解析失败的错误 res.send(err); }
方案2:用async/await改写,让异步错误能被try/catch捕获
把包含这段逻辑的函数改成async函数,用await等待Promise完成,这样异步错误就会被try/catch捕获:
// 假设外层是async函数,比如express路由处理函数 async function handleRequest(req, res) { try { let data = <some JSON data here>; let expression = jsonata("rows[userID=abc123]'])"); let result = await expression.evaluate(data); // await等待Promise执行完成 res.send(result); } catch(err) { // 同时捕获同步错误(表达式解析失败)和异步错误(evaluate执行出错) res.send(err); } }
说明:jsonata()解析表达式时的错误是同步抛出的,会被原try/catch捕获;但evaluate()的异步错误必须通过上述两种方式处理,才能被正确捕获并返回给浏览器。
内容的提问来源于stack exchange,提问作者Jeremy Ragsdale
相关产品推荐
相关产品推荐

