本文假設:
* 你已經熟悉了JavaScript、Java、 Python、 C++ 或者類似的語言中異常的概念,而且你知道拋出異常和捕獲異常是什么意思。
* 你熟悉怎么用NodeJS編寫代碼。你使用異步操作的時候會很自在,并能用`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,這個函數正是為了處理異常和處理異步操作返回結果的。 - 在EventEmitter上觸發一個Error事件。
接下來我們會詳細討論這幾種方式。這篇文章不假設你知道任何關于domains的知識。
最后,你應該知道在JavaScript里,錯誤和異常是有區別的。錯誤是Error的一個實例。錯誤被創建并且直接傳遞給另一個函數或者被拋出。如果一個錯誤被拋出了那么它就變成了一個異常[腳注2]。舉個例子:
~~~
throw new Error('something bad happened');
~~~
但是使用一個錯誤而不拋出也是可以的
~~~
callback(new Error('something bad happened'));
~~~
這種用法更常見,因為在NodeJS里,大部分的錯誤都是異步的。實際上,`try/catch`唯一常用的是在`JSON.parse`和類似驗證用戶輸入的地方。接下來我們會看到,其實很少要捕獲一個異步函數里的異常。這一點和Java,C++,以及其它嚴重依賴異常的語言很不一樣。