2014-09-19 86 views
2

正如我所看到的,它是經常可以看到這樣一行:節點式回調:完成(異常)還是拋出異常?

if (err) return done(err); 

但正如我的理解對不對,我可以這樣做:

if (err) throw err; 

這看起來相當與做工不錯。那有什麼區別?

是啊,我知道承諾,我喜歡他們,但仍然,我想知道這個問題的答案。

回答

2

你可以做

if (err) throw err; 

如果錯誤是致命的,你希望你的程序崩潰,因爲沒有辦法趕上這樣的錯誤。如果您編寫庫或服務器應用程序,則應將錯誤傳遞給回調。

+0

真的嗎?我認爲promise會捕獲這些異常,並用catch回調包裝它。這是真的? – dt0xff 2014-09-19 14:24:18

+0

這個問題不是關於承諾,是嗎?在承諾中,您可以安全地引發異常,這是事實,但您不需要重新引發錯誤,因爲它們會自動傳播。 – vkurchatkin 2014-09-19 14:30:48

+0

是的,是有點偏題)所以,沒有承諾,我應該總是@done(err)@如果我想抓住它在上層邏輯和處理它,但它錯誤是致命的,我應該扔它通過電子郵件或自動通知自己? – dt0xff 2014-09-19 14:55:12

1

由於大多數錯誤是異步的,因此您可能希望使用回調將錯誤傳播回錯誤處理程序。

Try/catch塊很少使用,只適用於可能失敗的少數同步函數,如JSON.parse()