背景

2018-02-24 16:16 更新

本文假設(shè):

  • 你已經(jīng)熟悉了JavaScript、Java、 Python、 C++ 或者類(lèi)似的語(yǔ)言中異常的概念,而且你知道拋出異常和捕獲異常是什么意思。
  • 你熟悉怎么用NodeJS編寫(xiě)代碼。你使用異步操作的時(shí)候會(huì)很自在,并能用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);
}
}

你還要熟悉三種傳遞錯(cuò)誤的方式: - 作為異常拋出。 - 把錯(cuò)誤傳給一個(gè)callback,這個(gè)函數(shù)正是為了處理異常和處理異步操作返回結(jié)果的。 - 在EventEmitter上觸發(fā)一個(gè)Error事件。

接下來(lái)我們會(huì)詳細(xì)討論這幾種方式。這篇文章不假設(shè)你知道任何關(guān)于domains的知識(shí)。

最后,你應(yīng)該知道在JavaScript里,錯(cuò)誤和異常是有區(qū)別的。錯(cuò)誤是Error的一個(gè)實(shí)例。錯(cuò)誤被創(chuàng)建并且直接傳遞給另一個(gè)函數(shù)或者被拋出。如果一個(gè)錯(cuò)誤被拋出了那么它就變成了一個(gè)異常[腳注2]。舉個(gè)例子:

throw new Error('something bad happened');

但是使用一個(gè)錯(cuò)誤而不拋出也是可以的

callback(new Error('something bad happened'));

這種用法更常見(jiàn),因?yàn)樵贜odeJS里,大部分的錯(cuò)誤都是異步的。實(shí)際上,try/catch唯一常用的是在JSON.parse和類(lèi)似驗(yàn)證用戶輸入的地方。接下來(lái)我們會(huì)看到,其實(shí)很少要捕獲一個(gè)異步函數(shù)里的異常。這一點(diǎn)和Java,C++,以及其它嚴(yán)重依賴異常的語(yǔ)言很不一樣。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)