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功能的更多信息。