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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:02