async方法何时抛出,你如何捕获它们?

时间:2017-02-13 11:34:10

标签: javascript node.js exception asynchronous

来自节点doc

  

Node.js API中的一些典型异步方法可能   仍然使用throw机制来引发必须处理的异常   使用try / catch。没有这些方法的全面清单;   请参考每种方法的文档来确定   需要适当的错误处理机制。

有人能带来这种异步并仍然抛出的功能的例子吗?你如何以及何时捕获例外呢?

更具体地说。他们是否提到这样的功能:

try
{

   obj.someAsync("param", function(data){
                    console.log(data);
                 });
}catch(e)
{

}

现在通常我知道上面没有意义 - 因为当回调执行时,try块可能已经退出。

  • 但文献摘录中提到的是什么样的例子?如果async方法按照它们的说法抛出,我应该在哪里,何时以及如何处理它? (或者,如果你展示了这样的功能,你可以在其文档中显示它如何处理它,如报价所述吗?)

2 个答案:

答案 0 :(得分:3)

像你的例子中那样的异步方法通常会引发程序员错误,例如错误的参数,并且他们会因操作错误而调用回调错误。

但是ES2017中也有异步函数(用async function声明),并且通过拒绝它们返回的声明来发出错误信号 - 当你将它们与await关键字一起使用时会变成抛出异常。

示例:

function x(arg, cb) {
    if (!arg) throw new Error('Programmer error: bad arguments');
    setTimeout(() => {
        cb(new Error('Operational error: something bad happened'));
    }, 2000);
}

现在当你使用它时,你通常想要处理程序员错误 - 你想修复它们。所以你不这样做:

try {
    x();
} catch (err) {
    // Why should I handle the case of bad invocation
    // instead of fixing it?
}

您处理的操作错误如下:

x(function (err) {
    if (err) {
        // handle error
    } else {
        // success
    }
});

现在,如果您有一个不接受回调但返回承诺的函数:

function y() {
    return new Promise((res, rej) => setTimeout(() => rej('error'), 2000));
}

然后你就像这样处理错误:

y().catch(error => {
    // handle error
});

或者,在使用await时:

try {
    await y();
} catch (err) {
    // handle error
}

有关操作错误和程序员错误之间差异的更多信息,请参阅:

有关承诺的更多信息以及async / await,请参阅this answer中的链接。

答案 1 :(得分:-1)

afaik异步功能可以通过三种方式“抛出”;以及如何抓住每一个:

  • 和任何其他函数一样(也就是某人搞砸了):我不会抓住这些情况,因为它们不应该在我的代码中,并且捕获这些错误会使查找和修复它们变得更加困难。

function foo(){
//someone messed up, better fixing than catching this
return new Prooooooooooomise((resolve) => 42);
}

try {
foo();
}catch(err){
console.error(err);
}

  • 承诺:

function foo(){ return Promise.resolve('bar') }

foo().then(value => value =========> 'error')
.catch(err => {
	console.error(err);
	return "fixedValue";
});

  • 和节点回调语法/模式:

function foo(value, callback){
setTimeout(function(){
	if(Math.random() < .5){
		callback("I don't like to", undefined);
	}else{
		callback(null, value * 2);
	}
}, 500);
}

foo(21, function(err, data){
if(err){
	//no try..catch at all
	console.error(err);
}else{
	//do whatever with data
}
})

这些是您最常见的异步错误;好吧,第一个只是异步方法中的一个普通错误。