本文假設(shè):
callback(err,result)
模式去完成異步操作。你得知道下面的代碼不能正確處理異常的原因是什么[腳注1]function myApiFunc(callback)
{
/*
* This pattern does NOT work!
*/
try {
doSomeAsynchronousOperation(function (err) {
if (err)
throw (err);
/* continue as normal */
});
} catch (ex) {
callback(ex);
}
}
你還要熟悉三種傳遞錯誤的方式: - 作為異常拋出。 - 把錯誤傳給一個callback,這個函數(shù)正是為了處理異常和處理異步操作返回結(jié)果的。 - 在EventEmitter上觸發(fā)一個Error事件。
接下來我們會詳細(xì)討論這幾種方式。這篇文章不假設(shè)你知道任何關(guān)于domains的知識。
最后,你應(yīng)該知道在JavaScript里,錯誤和異常是有區(qū)別的。錯誤是Error的一個實(shí)例。錯誤被創(chuàng)建并且直接傳遞給另一個函數(shù)或者被拋出。如果一個錯誤被拋出了那么它就變成了一個異常[腳注2]。舉個例子:
throw new Error('something bad happened');
但是使用一個錯誤而不拋出也是可以的
callback(new Error('something bad happened'));
這種用法更常見,因?yàn)樵贜odeJS里,大部分的錯誤都是異步的。實(shí)際上,try/catch
唯一常用的是在JSON.parse
和類似驗(yàn)證用戶輸入的地方。接下來我們會看到,其實(shí)很少要捕獲一個異步函數(shù)里的異常。這一點(diǎn)和Java,C++,以及其它嚴(yán)重依賴異常的語言很不一樣。
更多建議: