2017-02-10 129 views
17

我发现了一个教程下面的代码:重新抛出错误

promise.then(function(result){ 
    //some code 
}).catch(function(error) { 
    throw(error); 
}); 

我有点困惑:不渔获调用就可以完成什么?在我看来,它没有任何效果,因为它只是抛出了被捕获的相同错误。我的基础是如何定期尝试/捕捉工作。

+0

你能提供一个指南的链接吗?也许有额外的上下文,这将有所帮助... – Igor

+0

@Igor我不能,它在Pluralsight上。这可能只是一些错误处理逻辑的占位符? –

+0

这就是我所猜测的,因为它什么也没有做,然后将错误传递给调用者,这也可以通过没有捕获来开始。 – Igor

回答

23

没有任何意义的裸体抓住和抛出,因为你展示。除了添加代码和执行速度慢之外,它没有任何用处。所以,如果你打算.catch()并重新抛出,应该有你想要做的.catch(),否则你应该完全删除.catch()

该通用结构的通常点是当你想要执行.catch()中的某些内容时,例如记录错误或清除某些状态(如关闭文件),但希望承诺链继续被拒绝。

promise.then(function(result){ 
    //some code 
}).catch(function(error) { 
    // log and rethrow 
    console.log(error); 
    throw error; 
}); 

在教程中,可以在那里只是为了显示人们在那里他们可以赶上错误或教的处理错误,然后重新抛出它的概念。

+0

从我的意见来说,这不是一个好例子。使用这种方法,您可以轻松获得多个日志记录1个错误在java中,你可以抛出新的异常(periousException);'我不知道javascript是否支持嵌套错误,但无论如何,“日志和抛出”是不好的做法。 – Cherry

+4

@Cherry--你不能说这是一个不好的习惯。有时候模块想要以自己的方式记录自己的错误,这是一种方法。此外,我不推荐这样做,我只是解释说,除非在'.catch()'中执行SOMETHING其他操作,否则没有理由使用'.catch()'并在catch中抛出相同的错误。这就是答案的要点。 – jfriend00

2

所以这听起来像你的问题是'在承诺链中,.catch()方法有什么作用?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/throw

throw语句“将停止(抛后的报表将不会被执行),并且控制将被传递到调用堆栈中的第一个catch块。如果没有catch块调用函数中存在该程序将终止。“

在承诺链中,.then()方法将返回某种类型的数据块。块的这种返回将完成承诺。数据的成功返回完成了承诺。您可以用相同的方式考虑.catch()方法。 .catch()将处理不成功的数据检索。 throw语句完成了这个承诺。在开始的时候,你会看到开发者使用.catch((err)=> {console.log(err))}这也会完成承诺链。

3

如果完全忽略catch方法调用,没有什么重要区别。

它唯一添加的是一个额外的微任务,在实践中意味着你会注意到承诺迟于没有catch条款的情况下承诺的情况。

下一个片段演示了这一点:

var p; 
 
// Case 1: with catch 
 
p = Promise.reject('my error 1') 
 
     .catch(function(error) { 
 
      throw(error); 
 
     }); 
 

 
p.catch(error => console.log(error)); 
 
// Case 2: without catch 
 
p = Promise.reject('my error 2'); 
 

 
p.catch(error => console.log(error));

注二等排斥反应如何前首次报道。这是唯一的区别。

+0

snippet正常工作。但是,该服务现在不可用..检查:http://meta.stackoverflow.com/a/337257/747579 –

2

.then().catch()方法返回Promises,并且如果在任一处理程序中抛出Exception,则返回的promise将被拒绝,并且Exception将在下一个拒绝处理程序中被捕获。

在下面的代码中,我们扔在第一.catch()一个例外,它被捕获在第二.catch()

new Promise((resolve, reject) => { 
 
    console.log('Initial'); 
 

 
    resolve(); 
 
}) 
 
.then(() => { 
 
    throw new Error('Something failed'); 
 
     
 
    console.log('Do this'); // Never reached 
 
}) 
 
.catch(() => { 
 
    console.log('Something failed'); 
 
    throw new Error('Something failed again'); 
 
}) 
 
.catch((error) => { 
 
    console.log('Final error : ', error.message); 
 
});

第二.catch()返回一个承诺成立时, .then()处理程序可称为:

new Promise((resolve, reject) => { 
 
    console.log('Initial'); 
 

 
    resolve(); 
 
}) 
 
.then(() => { 
 
    throw new Error('Something failed'); 
 
     
 
    console.log('Do this'); // Never reached 
 
}) 
 
.catch(() => { 
 
    console.log('Something failed'); 
 
    throw new Error('Something failed again'); 
 
}) 
 
.catch((error) => { 
 
    console.log('Final error : ', error.message); 
 
}) 
 
.then(() => { 
 
    console.log('Show this message whatever happened before'); 
 
});

有用的参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining_after_a_catch

希望这有助于!