我可以在不使用 await 的情况下捕获异步错误吗?
Can I catch an error from async without using await?
是否可以捕获来自非等待异步调用的错误,将其发送到原始封装 try/catch,或引发未捕获的异常?
这是我的意思的一个例子:
async function fn1() {
console.log('executing fn1');
}
async function fn2() {
console.log('executing fn2');
throw new Error('from fn2');
}
async function test() {
try {
await fn1();
fn2();
}
catch(e) {
console.log('caught error inside test:', e);
}
}
test();
在这种情况下,fn2
抛出的错误会被默默吞噬,绝对不会被原来的try/catch
捕捉到。我相信这是预期的行为,因为 fn2
很可能被推到事件循环中以在将来的某个时间点完成,而 test
并不关心它何时完成(这是有意的) .
除了将 try/catch
置于 fn2
内部并执行诸如发出错误之类的操作之外,是否有任何方法可以确保错误不会被这样的结构意外吞噬?我什至会在不知道如何捕获的情况下接受未捕获的错误,我认为——我不希望抛出的错误是我正在编写的程序的典型流程,但是吞下错误会使调试变得相对烦人。
旁注,我正在使用 Babel 通过 babel-runtime 转换转译代码,并使用 node 执行它。
如果您熟悉 promises,请使用它们。如果没有,你可以试试这个例子,让你的代码更加异步:)
function fn1(callback) {
console.log('executing fn1');
callback({status: true});
}
function fn2(callback) {
console.log('executing fn2');
callback({status: false});
}
function test() {
fn1(function(result) {
console.log('fn1 executed with status ' + result.status);
});
fn2(function(result) {
console.log('fn2 executed with status ' + result.status);
if (result.status == false) {
console.log('error in fn2');
}
});
}
test();
处理未处理的被拒绝的本机承诺(并且 async/await 使用本机承诺)是 V8 现在支持的功能。它在最新的 Chrome 中用于在未处理被拒绝的承诺时输出调试信息;在 the Babel REPL 尝试以下操作:
async function executor() {
console.log("execute");
}
async function doStuff() {
console.log("do stuff");
throw new Error("omg");
}
function handleException() {
console.error("Exception handled");
}
(async function() {
try {
await executor();
doStuff();
} catch(e) {
handleException();
}
})()
你看到了,即使 doStuff()
的异常丢失了(因为我们在调用它时没有使用 await
),Chrome 记录了一个被拒绝的承诺未处理到控制台:
这在 Node.js 4.0+ 中也可用,但需要收听 a special unhandledRejection
event:
process.on('unhandledRejection', function(reason, p) {
console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging, throwing an error, or other logic here
});
是否可以捕获来自非等待异步调用的错误,将其发送到原始封装 try/catch,或引发未捕获的异常?
这是我的意思的一个例子:
async function fn1() {
console.log('executing fn1');
}
async function fn2() {
console.log('executing fn2');
throw new Error('from fn2');
}
async function test() {
try {
await fn1();
fn2();
}
catch(e) {
console.log('caught error inside test:', e);
}
}
test();
在这种情况下,fn2
抛出的错误会被默默吞噬,绝对不会被原来的try/catch
捕捉到。我相信这是预期的行为,因为 fn2
很可能被推到事件循环中以在将来的某个时间点完成,而 test
并不关心它何时完成(这是有意的) .
除了将 try/catch
置于 fn2
内部并执行诸如发出错误之类的操作之外,是否有任何方法可以确保错误不会被这样的结构意外吞噬?我什至会在不知道如何捕获的情况下接受未捕获的错误,我认为——我不希望抛出的错误是我正在编写的程序的典型流程,但是吞下错误会使调试变得相对烦人。
旁注,我正在使用 Babel 通过 babel-runtime 转换转译代码,并使用 node 执行它。
如果您熟悉 promises,请使用它们。如果没有,你可以试试这个例子,让你的代码更加异步:)
function fn1(callback) {
console.log('executing fn1');
callback({status: true});
}
function fn2(callback) {
console.log('executing fn2');
callback({status: false});
}
function test() {
fn1(function(result) {
console.log('fn1 executed with status ' + result.status);
});
fn2(function(result) {
console.log('fn2 executed with status ' + result.status);
if (result.status == false) {
console.log('error in fn2');
}
});
}
test();
处理未处理的被拒绝的本机承诺(并且 async/await 使用本机承诺)是 V8 现在支持的功能。它在最新的 Chrome 中用于在未处理被拒绝的承诺时输出调试信息;在 the Babel REPL 尝试以下操作:
async function executor() {
console.log("execute");
}
async function doStuff() {
console.log("do stuff");
throw new Error("omg");
}
function handleException() {
console.error("Exception handled");
}
(async function() {
try {
await executor();
doStuff();
} catch(e) {
handleException();
}
})()
你看到了,即使 doStuff()
的异常丢失了(因为我们在调用它时没有使用 await
),Chrome 记录了一个被拒绝的承诺未处理到控制台:
这在 Node.js 4.0+ 中也可用,但需要收听 a special unhandledRejection
event:
process.on('unhandledRejection', function(reason, p) {
console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging, throwing an error, or other logic here
});