使用上述代码,nestedFunc2
中的异常一定会被那个 try
/catch
块捕获。
我怀疑你实际上遇到的是 异步回调函数 中的异常:
try {
someNodeAPIFunction((err, result) => {
});
} catch (e) {
console.log(e);
}
如果是这样的话,那么在
try
/
catch
块中捕获不到异常是完全正常的,因为该代码已经执行完毕。回调函数会在稍后被调用,唯一能够捕获异常的只有调用回调函数的
someNodeAPIFunction
中的代码。
这就是回调API难以处理的原因之一。
在任何一个相对较新的Node.js版本中,您都可以使用
async
/
await
来简化操作。现在,Node.js提供了一些API函数的Promise版本(特别是
fs.promises
模块),并且还提供了
promisify
实用程序函数,您可以使用该函数将标准的Node.js回调式函数转换为返回承诺的函数。因此,例如,使用上述代码:
const someNodeAPIFunctionPromisified = util.promisify(someNodeAPIFunction)
然后,在一个async
函数中,你可以这样做:
try {
const result = await someNodeAPIFunctionPromisified();
} catch (e) {
console.log(e);
}
......并且该异常将被捕获,因为async
函数使您能够在处理异步结果时正确编写代码的逻辑流程。
有关async
函数的更多信息,请参见MDN上的页面。