顯式和隱藏異常及錯誤參數
設計應用程序時,我們需要考慮到如何去處理髮生的錯誤,例如錯誤日誌記錄、錯誤干預。可以簡單理解為,在哪裡可能出現錯誤,那麼我們需要捕獲並且處理。在本書中,我們會介紹在Node應用中可能發生的各種形式的錯誤。
那一些明確由throw關鍵詞觸發的異常拋出我們稱為顯式異常。它們即表示了有錯誤發生了:
function formatName (name) {
if (!name) throw new Error("name is required");
...
}
try {
formatName();
} catch (err) {
console.log(err.message, err.stack);
}
如果你嘗試拋出自定義的異常,那麼有一些規則需要銘記於心:throw只能用於同步方法中。或者當非同步方法中非同步執行觸發前throw會生效。(例如誤用API)。通常拋出的異常對象都要繼承於Error。使用簡單的字元串(如throw"Oh no!")無法獲取對應的調試堆棧,即無法獲取哪裡發生錯誤的相關信息。不要在內置的Node方法中的回調函數中拋出異常;這樣子捕獲到的堆棧沒有什麼有效的信息。我們可以直接處理異常或者把異常傳遞給另外的適合處理錯誤的函數。如果結構支持,你可以在非同步塊中也使用throw了。例如部分非穩定的特性,如domains、promise、generators。
隱藏的異常是指在JavaScript運行時不是由throw關鍵字觸發的異常。不幸的是,這些異常很容易就溜進我們的代碼中。其中一個很常見的異常是ReferenceError,當變數或者屬性的引用未找到時會發生。這裡,我們來看一個因為data的錯誤拼寫導致的異常:
function (err, data) {
}
另外一個很常見的異常是SyntaxError,最出名的就是使用JSON.parse來解析無效JSON數據:
一種很棒的方式來發現隱藏的異常是使用類似JSHint或者JSLint的工具。把它們加入到你構建的過程中來保障代碼得到有效的檢查。這一章後續我們會了解更多關於這方面的內容。
在Node中,錯誤事件可以在任意繼承EventEmitter的對象中觸發。如果沒有相應的處理,Node則會拋出錯誤異常。這些事件如果未綁定處理函數,是調試中最有難度的,因為可能在非同步處理過程中會發生多次錯誤,類似有極少調用堆棧的stream數據:
幸運的是,我們知道這個錯誤來自哪裡:就在我們剛寫的那一點點代碼里。但是在大型的應用中,有可能是因為DNS層出現錯誤,而我們無從得知哪個模塊用了DNS而導致的問題。所以,儘可能地綁定錯誤處理事件:
ee.on("error", function (err) {
console.error(err.message, err.stack);
});
當編寫自定義的EventEmitters對象時,在自己的執行代碼以及定義的API中發生錯誤時,需要提供依賴的相關上下文,來拋給上層以便調試。同樣地,使用Error對象而非字元串,以便找到對應的錯誤堆棧信息。
在非同步操作中發生的錯誤通常會作為回調函數的第一個參數傳遞過去。這和我們前邊提到的錯誤不一樣,這些通常不會直接引起異常。但是它們可能是部分隱藏的異常的源頭。
var data = buf.toString();
...
});
如上,我們忽略readFile返回的錯誤,假定獲取的文件數據已經返回了對應的buffer。不幸的是,當某一天無法讀取相應的文件時,就會因為buf無法獲取而拋出一個ReferenceError異常。這是處理異常錯誤很棒的方法,這意味著很多時間,簡單地把錯誤傳入對應的錯誤處理函數即可優雅地處理好。
處理好我們提及的這四種類型的錯誤,可以讓我們在遇到需要調試的問題時來獲取更多有用的幫助信息。儘管有很多優秀的實踐經驗和工具,但是我們還是會發現一些導致程序崩潰的異常。我們需要了解一下如何設計應用來確保可以快速地定位和修複發生的異常。


※Node處理未捕獲的異常
※一個測試web應用程序的Mocha測試
※簡單的Mocha測試項目的package.json配置文件
※一個關於test測試腳本的pakcage.json配置文件
TAG:行家匯 |
※被隱藏的「罪惡」
※警惕:常見的幾種小病可能隱藏癌症危機,別被誤診了!
※貪嗔痴里隱藏的秘密
※原來膽汁反流性胃炎「隱藏」這麼多秘密,千萬不要被表面假象迷惑
※數據刷只是誤讀,三隱藏屬性力證威少超巨成色
※這種樹極為罕見,經常會「流血」,其隱藏的藥用價值令人眼紅
※為什麼常用的視力表字母都是E?簡單的字母卻隱藏巨大秘密
※無意間打開的大門,很可能隱藏著暗物質和量子的奧秘
※隱藏&取消隱藏
※語言傷害比身體傷害更大,解密隱藏在生活中看似平常的牢籠現象
※樣式繁多的尖頭細跟,可以激發女性隱藏的魅力
※女性了解自己 從隱藏在性激素里的小秘密開始
※對於缺點,越想隱藏卻越容易被發現的星座
※顏色會出賣你的隱藏性格喲
※大智若愚,心機往往隱藏在看似愚蠢的表面
※發色還可以這樣隱藏起來,短髮+隱藏式彩虹染髮,太美太有個性了!
※蹇卦——危機的另一面往往是亨通,困難的背後也常常隱藏著機遇
※排尿異常看不出尿毒症!這4個癥狀,才可能是尿毒症「隱藏的殺機」
※這種動物除了會光合作用,還會變色,它的體內隱藏大量的抗癌劑
※臀大肌怎麼練?除了船式,還有很多隱藏的體式可以發掘