try/catch javascript 中嵌套函数的问题

Lov*_*ngh 11 javascript try-catch node.js

我有一个像下面这样的场景:

try {
   top();
} catch(e) {
   console.log(e);
}

function top() {
    nestedFunc1();
}

function nestedFunc1() {
    nestedFunc2();
}

function nestedFunc2() {
 // this function throws an exception.
}
Run Code Online (Sandbox Code Playgroud)

每当我的节点脚本中抛出异常时,我的 catch 块就不会被执行。这是预期的行为还是我在这里遗漏了一些东西。

T.J*_*der 14

通过上面的代码,该/块nestedFunc2肯定会捕获异常。trycatch

我怀疑你真正拥有的是异步回调中的异常:

try {
    someNodeAPIFunction((err, result) => {
        // Exception thrown here
    });
} catch (e) {
    console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

try如果是这样,那么是的, /那里没有捕获异常是完全正常的catch,因为该代码已经完成运行。稍后调用回调。唯一可以捕获异常的是someNodeAPIFunction调用回调的代码。

这是回调 API 难以使用的原因之一。

在 Node.js 的任何较新版本中,您都可以使用async/await来简化事情。Node.js 现在提供了一些 API 函数(特别是fs.promises模块)的启用 Promise 的版本,并且还提供了promisify实用程序函数,您可以使用该函数将标准 Node.js 回调式函数转换为返回 Promise 的函数。例如,对于上面的内容:

const someNodeAPIFunctionPromisified = util.promisify(someNodeAPIFunction);
Run Code Online (Sandbox Code Playgroud)

然后,在一个async函数中,你可以这样做:

try {
    const result = await someNodeAPIFunctionPromisified();
    // Exception thrown here
} catch (e) {
    console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

...并且异常会被捕获,因为async即使在处理异步结果时,函数也可以让您正确地处理代码的逻辑流程。

有关MDN 上的async功能的更多信息。