關鍵要點
- 巧妙運用
try…catch
語句塊有效管理異常,通過允許錯誤向上冒泡到調用棧來增強調試過程,從而更清晰地顯示錯誤。 - 實現全局錯誤處理程序(例如
window.onerror
事件)來集中和簡化錯誤處理,以便於在應用程序的不同部分進行管理和維護。 - 利用瀏覽器記錄詳細錯誤信息(包括調用棧)的能力來改進錯誤診斷,並更清晰地了解錯誤的來源和上下文。
- 通過在
try…catch
塊中使用setTimeout
或使用適用於所有執行上下文的全局錯誤處理程序來解決異步錯誤處理難題,確保有效捕獲和管理異步代碼中的錯誤。 - 通過創建自定義錯誤類型或豐富錯誤消息來增強錯誤信息,從而更容易識別和解決特定問題,並提高JavaScript代碼的整體健壯性。
JavaScript中的錯誤處理,充滿了挑戰。遵循墨菲定律,任何可能出錯的事情都會出錯。本文將探討JavaScript中的錯誤處理,涵蓋陷阱、最佳實踐,並以異步代碼和Ajax為例進行講解。
本文於2017年6月8日更新,以解決讀者反饋。具體來說,已向代碼片段中添加文件名,清理了單元測試,向
uglyHandler
添加了包裝器模式,並增加了關於CORS和第三方錯誤處理程序的部分。
我認為JavaScript的事件驅動範式為該語言增添了豐富性。我喜歡將瀏覽器想像成這台事件驅動的機器,錯誤也不例外。當發生錯誤時,某個時刻會拋出一個事件。理論上,可以說錯誤只是JavaScript中的簡單事件。
如果您覺得這很陌生,請係好安全帶,因為您將經歷一段相當精彩的旅程。在本文中,我將只關注客戶端JavaScript。
本主題基於在《JavaScript中卓越的異常處理》中解釋的概念。如果您不熟悉,我建議您閱讀基礎知識。本文還假設您具備中等水平的JavaScript知識。如果您想提升水平,為什麼不註冊SitePoint Premium並觀看我們的課程JavaScript:下一步?第一課是免費的。
無論哪種情況,我的目標都是探索超越處理異常的必要條件。閱讀本文後,下次看到一個不錯的try...catch
塊時,您會三思而後行。
演示
本文將使用的演示程序可在GitHub上找到,它呈現如下頁面:
所有按鈕在單擊時都會引爆一顆“炸彈”。這顆炸彈模擬了一個作為TypeError拋出的異常。以下是此模塊的定義:
// scripts/error.js function error() { var foo = {}; return foo.bar(); }
首先,此函數聲明一個名為foo的空對象。請注意,bar()
在任何地方都沒有定義。讓我們用一個好的單元測試來驗證這將引爆一顆炸彈:
// tests/scripts/errorTest.js it('throws a TypeError', function () { should.throws(error, TypeError); });
此單元測試使用Mocha進行測試斷言,並使用Should.js進行斷言。 Mocha是一個測試運行器,而Should.js是斷言庫。如果您還不熟悉,請隨意探索測試API。測試以it('description')
開頭,並在should
中以通過/失敗結束。單元測試在Node上運行,不需要瀏覽器。我建議您注意這些測試,因為它們用純JavaScript證明了關鍵概念。
克隆存儲庫並安裝依賴項後,您可以使用
npm t
運行測試。或者,您可以像這樣運行此單個測試:./node_modules/mocha/bin/mocha tests/scripts/errorTest.js
。
如所示,error()
定義了一個空對象,然後嘗試訪問一個方法。由於bar()
不存在於對像中,因此它會拋出一個異常。相信我,對於像JavaScript這樣的動態語言,這種情況發生在每個人身上!
糟糕的處理方式
接下來是一些糟糕的錯誤處理。我已經將按鈕上的處理程序從實現中抽像出來。以下是處理程序的樣子:
// scripts/badHandler.js function badHandler(fn) { try { return fn(); } catch (e) { } return null; }
此處理程序接收一個fn
回調作為參數。然後,此回調在處理程序函數內被調用。單元測試顯示了它的用途:
// tests/scripts/badHandlerTest.js it('returns a value without errors', function() { var fn = function() { return 1; }; var result = badHandler(fn); result.should.equal(1); }); it('returns a null with errors', function() { var fn = function() { throw new Error('random error'); }; var result = badHandler(fn); should(result).equal(null); });
如您所見,如果出現問題,此糟糕的錯誤處理程序將返回null
。回調fn()
可以指向一個合法的方法或一顆炸彈。
下面的單擊事件處理程序說明了其餘的故事:
// scripts/badHandlerDom.js (function (handler, bomb) { var badButton = document.getElementById('bad'); if (badButton) { badButton.addEventListener('click', function () { handler(bomb); console.log('Imagine, getting promoted for hiding mistakes'); }); } }(badHandler, error));
糟糕的是,我只得到一個null
。當我試圖找出哪裡出錯時,這讓我一無所知。這種靜默失敗策略的範圍從糟糕的用戶體驗到數據損壞。令人沮喪的是,我可能會花數小時調試症狀,卻忽略了try-catch
塊。這個邪惡的處理程序會吞沒代碼中的錯誤,並假裝一切正常。對於那些不重視代碼質量的組織來說,這可能是可以接受的。但是,隱藏錯誤會在將來導致您花費數小時進行調試。在一個具有深層調用棧的多層解決方案中,不可能找出出錯的地方。就錯誤處理而言,這非常糟糕。
靜默失敗策略會讓您渴望更好的錯誤處理。 JavaScript提供了一種更優雅的處理異常的方法。
(以下內容與之前的輸出類似,只是對語言和表達方式進行了細微的調整,以保持文章大意不變,並避免重複。)
... (其餘部分與之前的輸出類似,只是對語言和表達方式進行了細微的調整,以保持文章大意不變,並避免重複。) ...
以上是在JavaScript中正確處理正確錯誤的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具

Dreamweaver Mac版
視覺化網頁開發工具