JS基礎-錯誤處理

2020-12-12 愛動漫的程式設計師

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高級程序設計

相關焦點

  • JavaScript錯誤處理完全指南
    出現致命的錯誤時可能就會是這種情況,因為停止程序比處理無效數據更安全。介紹了基礎知識之後,現在我們來研究 同步和異步 JavaScript 代碼中的錯誤和異常處理。同步代碼在大多數情況下很簡單,它的錯誤處理也是如此。同步代碼的執行順序和代碼的編寫順序一致。
  • 10個常見的JS語言錯誤總匯
    這與 1 中提到的 Chrome 的錯誤基本相同,但 Safari 使用了不同的錯誤消息提示語。 3、TypeError: Null Is Not an Object (evaluating...)這是在 Safari 中讀取屬性或調用空對象上的方法時發生的錯誤。您可以在 Safari Developer Console 中輕鬆測試。
  • 七種需要避免的Vue.js常見錯誤
    ),因此他們不僅無法充分利用Vue.js的全部潛能,而且可能時常犯錯。 就個人而言,我已經使用Vue.js一段時間了,除了收穫愉快的體驗與經驗,也曾犯過一些錯誤。為了避免大家跌入同樣的「坑」中,我在此將其中常見的七大錯誤總結如下: 1.添加模板編譯器 在嘗試導入Vue.js時,我發現:即使自己遵循了官方指南的說明事項,組件的內聯(inline)模板也會返回空白頁面。
  • JavaScript 錯誤處理大全【建議收藏】
    同步錯誤處理異步錯誤處理Node.js中的錯誤處理Node.js 中的同步錯誤處理Node.js 中的異步錯誤處理:回調模式Node.js 中的異步錯誤處理:事件發射器總結❞編程中有什麼錯誤?當發生致命的錯誤,需要更安全地停止程序而不是處理無效數據時,你可能需要這樣做。介紹了基礎知識之後,現在讓我們將注意力轉向同步和異步 JavaScript 代碼中的錯誤和異常處理。同步錯誤處理同步代碼通常很簡單,它的錯誤處理也是如此。
  • 關於JavaScript錯誤處理最完整的指南
    > http://localhost:5000/index.js:9此外,你可以看到發生錯誤的具體代碼行。出現致命的錯誤時可能就會是這種情況,因為停止程序比處理無效數據更安全。介紹了基礎知識之後,現在我們來研究 同步和異步 JavaScript 代碼中的錯誤和異常處理。同步代碼在大多數情況下很簡單,它的錯誤處理也是如此。同步代碼的執行順序和代碼的編寫順序一致。
  • Node.js 的 EventEmitter 事件處理詳解
    EventEmitter 類是 Node.js 的內置類,位於 events 模塊。刪除它們後,emit() 函數將發出事件,但沒有偵聽器對此作出響應:f1 被觸發f2 被觸發錯誤處理如果要在 EventEmitter 發出錯誤,必須用 error 事件名來完成。這是 Node.js 中所有 EventEmitter 對象的標準配置。
  • 在Node.js中,使用Promise.prototype.finally
    基礎操作由於某種原因而失敗,並且promise現在具有關聯的錯誤此外,已兌現或已兌現的promise被稱為「已結算」。promise也有一個.catch()功能是方便的錯誤處理。該.catch()函數只是.then()使用onRejected處理程序而不使用onFulfilled處理程序的便捷速記:就像.catch(),該.finally()功能是的便捷快捷方式.then()。
  • js錯誤處理,"try..catch"
    所以,try {…} 塊內的錯誤不會殺死腳本 — 我們有機會在 catch 中處理它。讓我們來看一些例子。在讀取階段發生的錯誤被稱為「解析時間(parse-time)」錯誤,並且無法恢復(從該代碼內部)。這是因為引擎無法理解該代碼。所以,try..catch 只能處理有效代碼中出現的錯誤。這類錯誤被稱為「運行時的錯誤(runtime errors)」,有時被稱為「異常(exceptions)」。
  • Express.js 作者棄用 Node.js,轉向 Go 語言
    今天 Express 的作者 TJ Holowaychuk 發了一篇文章,正式宣告和 Node.js 拜拜了,轉向 Go 語言
  • JavaScript 日期處理類庫 Moment.js 進入維護狀態
    根據官方提供的數據,Moment.js 已被成功用於數百萬個項目,截至2020年9月,Moment.js 每周下載量超過 1200 萬。但它畢竟是一個為 JavaScript 生態舊時代而構建的項目,近年來,雖然 Moment.js 有所發展,但其底層設計並沒有改變,依舊與 2011 年創建時基本相同。
  • video.js 7.0 文件結構分析
    ,它幫你做了細緻的處理。 主要處理展示錯誤的樣式設置。實現了播放器的加載機制 20. media-error.js 定義了各種錯誤的描述 21. modal-dialog.js 彈出層相關的內容 22. player.js 核心內容:
  • Moment.js官方推薦使用其它時間處理庫代替
    :Momentjs 正式進入維護期,不會再提供大版本更新,推薦使用其他時間處理庫代替或使用 JavaScript 處於實驗階段的提案 Temporal。Moment.js 已廣泛應用於數百萬個項目中,能幫助你處理網站中日期和時間的問題,我們感到萬分榮幸。截至 2020 年 9 月,Moment 每周下載量超 1200 萬次!然而 Moment 是為 JavaScript 生態系統的上一個時代而構建的。
  • egg.js和nest.js使用場景對比
    給新手從基礎開始學習的機會, 就是希望除了滿足業務需求之外, 團隊也能得到成長。一個企業基礎框架應滿足的基本要求: 約束規範、擴展機制、安全、高效業務開發最終還是希望能沉澱出一套自己的輪子根據上面的要求, 篩選出了eggjs和nestjs2個web框架, 其中nestjs是團隊一部分同學比較喜歡和嘗試使用了的。
  • centos7編程實踐:安裝nodejs
    2、node.js的優勢2.1、Nodejs語法完全是js語法,只要你懂js基礎就可以學會Nodejs後端開發Node打破了過去JavaScript只能在瀏覽器中運行的局面。當有用戶連接了,就觸發一個內部事件,通過非阻塞I/O、事件驅動機制,讓Node.js程序宏觀上也是並行的。使用Node.js,一個8GB內存的伺服器,可以同時處理超過4萬用戶的連接。2.3、實現高性能伺服器 嚴格地說,Node.js是一個用於開發各種web伺服器的開發工具。
  • Vuejs基礎之:實例、模板、計算、class與Style綁定
    2.1   插值插值的簡單理解,即Vue.js通過模板的方式來編寫HTML,而模板中被Vue.js替換的部分,即是插值。2.1.4   使用javascript表達式•除了文本外,Vue.js還支持簡單的js語法,比如:•對於所有的數據綁定, Vue.js 都提供了完全的 JavaScript 表達式支持,代碼如圖
  • 【Node.js系列】Express 介紹
    中間件的分類:應用級中間件路由級中間件錯誤處理中間件內置中間件第三方中間件應用級中間件應用級中間件綁定到 app 對象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要處理的 HTTP 請求的方法,例如 get , put , post 等var
  • 一段代碼帶你論證JS基礎
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言JS基礎對於我們前端開發的重要性不言而知~於是,我們都會選擇去閱讀一些書籍來充實自己。那當我們讀完那些理論基礎之後,你是否依舊迷茫,還是豁然開朗?
  • Ember.js和Vue.js,哪種框架更適合前端開發?
    下面我們就來詳細分析Ember.js和Vue.js框架之間的異同。Ember.js因為Promise無處不在,所以你可以用簡單的方式編寫代碼和模塊,通過調用 Ember.js提供的API,以實現高度複雜的功能。在性能處理方面,Ember.js創建了相似的綁定機制和DOM更新,允許讓瀏覽器一次性處理它們,以提高工作性能(這樣做的好處是:避免為重複工作增加算力,浪費大量時間)。
  • Python與Node.JS:哪一個比較適合您的項目?
    1.速度和性能PythonPython的性能相對較慢,因為它在單個流程中處理請求,這與Node.js不同,後者可以進行高級多線程處理。 Django的使用可以在一定程度上處理高負載,但這仍然不是行動應用程式的可行選擇。
  • 把Node.js 中的回調轉換為 Promise
    JavaScript 是一種解釋性語言,一次只能處理一行代碼。有些任務可能需要很長時間才能完成,例如下載或讀取大文件等。JavaScript 將這些運行時間很長的任務轉移到瀏覽器或 Node.js 環境中的其他進程中。這樣它就不會阻止其他代碼的執行。通常異步函數會接受回調函數,所以完成之後可以處理其數據。