JS本身是動態語言,因此人們普遍認為它是一種最難於調試的程式語言。腳本出錯時,由於沒有上下文信息,讓人摸不著頭腦,ECMAScript 第 3 版致力於解決這個問題,專門引入了try-catch和throw等語句以及一些錯誤類型,意在讓開發人員能夠適當地處理錯誤,提升開發效率
瀏覽器錯誤提示
IE發生JS錯誤時,瀏覽器左下角會出現一個黃色的圖標,雙擊這個圖標,就會看到一個包含錯誤消息的對話框,其中還包含諸如行號、字符數、錯誤代碼及文件名等相關信息
Firefox & Chrome & Opera發生JS錯誤時,瀏覽器不會給出提示,你必須進入到控制臺,查看錯誤信息。控制臺顯示錯誤消息、引發錯誤的 URL 和錯誤所在的行號等信息。單擊文件名即可以只讀方式打開發生錯誤的腳本,發生錯誤的代碼行會突出顯示
SafariSafari在默認情況下都會隱藏全部JS錯誤信息,你必須啟用開發者菜單才能查看這些信息
錯誤處理 - 自帶語法
try-catch語句try{// 可能會導致錯誤的代碼 // try塊中的任何代碼發生了錯誤,就會立即退出代碼執行過程,然後接著執行捕獲// 此時catch塊會接收到一個包含錯誤信息的對象// throw語句拋出錯誤信息throw new Error('error message')} catch(error){// 在錯誤發生時怎麼處理console.log(error.message) // message是所以瀏覽器都支持的屬性,推薦使用// 不同瀏覽器增加了不同的error屬性- IE 添加了與 message 屬性完全相同的 description 屬性,還添加了保存 著內部錯誤數量的number屬性- Firefox添加了fileName、lineNumber和stack(包含棧跟蹤信息) 屬性- Safari添加line(表示行號)、sourceId(表示內部錯誤代碼)和sourceURL屬性}
finallytry{// 可能會導致錯誤的代碼}catch(error){// 錯誤處理語句}finally{// 必定執行語句,不受try & catch操作的影響,最終結果以它為準}
window.onerror()// 當JS監控到錯誤發生的時候觸發該方法註:只要發生錯誤,無論是不是瀏覽器生成的,都會觸發error事件,並執行這個事件處理程序。然後,瀏覽器默認的機制發揮作用,像往常一樣顯示出錯誤消息。像下面這樣在事件處理程序中返回false,可以阻止瀏覽器報告錯誤的默認行為。 window.onerror = function(message, source, lineno, colno, error) {console.log('...');return false;}
錯誤處理 - 單元測試框架
幾個常見的前端單元測試框架,這邊簡單介紹Jest,其它也有許多優秀的框架這邊就不做過多概述了其它優秀框架:Mocha/Jasmine/AVA/Tape等
Jest(會專門整理一篇文章)優點- 較好的支持React(facebook開發)- 基於 Jasmine 至今已經做了大量修改添加了很多特性- 開箱即用配置少,API簡單- 支持斷言和仿真,支持快照測試- 在隔離環境下測試- 互動模式選擇要測試的模塊- 優雅的測試覆蓋率報告,基於Istanbul- 智能並行測試,全局環境支持- 擁有功能強大的模擬庫- Typescript兼容舉個簡單的例子- 新建一個js文件,測試function total(a,b){return a+b;}- 再次新建一個js文件,並引入我們剛才創建js文件const total = require('./total');// test()函數來描述一個測試用例test('testName', () => { expect(total(1, 2)).toBe(3); // toBe("通過條件")});- 配置腳本,執行npm run test,顯示測試成果通過則顯示成功結果,不通過則顯示當前返回結果和預期返回結果
錯誤類型
Error基礎錯誤類型,其它錯誤類型都繼承於該類型
EvalErrorEvalError 類型的錯誤會在使用 eval()函數而發生異常時被拋出new eval(); //拋出EvalErroreval = foo; //拋出EvalError
RangeErrorRangeError 類型的錯誤會在數值超出相應範圍時觸發
ReferenceError訪問不存在的變量時,就會發生這種錯誤
SyntaxError當我們把語法錯誤的 JavaScript 字符串傳入 eval()函數時,就會導致此類錯誤
TypeError在變量中保存著意外的類型時,或者在訪問不存在的 方法時,都會導致這種錯誤。錯誤的原因雖然多種多樣,但歸根結底還是由於在執行特定於類型的操作 時,變量的類型並不符合要求所致。
URIError在使用 encodeURI()或 decodeURI(),而 URI 格式不正確時,就會導致 URIError 錯誤
總結
沒有人的代碼是完美無缺的,在編碼過程中錯誤是相對難以避免的,那麼當問題出現的時候我們怎麼去比較好的發現它,並解決它就成了一個首當其衝的問題了。從原生代碼層次我們可以通過try-catch和window.onerror和單元測試框架來使得我們代碼更具魯棒性,提升開發效率
參考資料
參考資料:JavaScript高級程序設計