异步方法什么时候抛出,如何捕获它们



来自节点文档:

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

有人能举这样一个异步且仍然抛出的函数的例子吗?那么,您是如何以及何时捕获异常的?

更具体地说。他们指的是这样的功能吗:

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

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

  • 但是文档中的摘录指的是什么样的示例?如果async方法按照他们所说的抛出,那么我应该在哪里、何时以及如何处理它?(或者,如果你展示了这样的功能,你能展示一下它的文档中关于如何处理报价中提到的内容吗?)

像您的例子中的异步方法通常会为程序员抛出错误,比如坏参数,它们会为操作错误调用带错误的回调。

但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
}
});

现在,如果你有一个函数不接受回调,但返回一个promise:

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

然后你处理这样的错误:

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

或者,在使用await:时

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

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

  • Dave Pacheco的Node.js错误处理最佳实践
  • Node.js中的错误处理

有关promise和async/await的更多信息,请参阅此答案中的链接。

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
}
})

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

最新更新