2017-02-10 125 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

希望這有助於!