来自节点doc:
Node.js API中的一些典型异步方法可能 仍然使用throw机制来引发必须处理的异常 使用try / catch。没有这些方法的全面清单; 请参考每种方法的文档来确定 需要适当的错误处理机制。
有人能带来这种异步并仍然抛出的功能的例子吗?你如何以及何时捕获例外呢?
更具体地说。他们是否提到这样的功能:
try
{
obj.someAsync("param", function(data){
console.log(data);
});
}catch(e)
{
}
现在通常我知道上面没有意义 - 因为当回调执行时,try
块可能已经退出。
答案 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
}
})
这些是您最常见的异步错误;好吧,第一个只是异步方法中的一个普通错误。