[英]What are jQuery best practices regarding Ajax convenience methods and error handling?
[英]What are the best practices for JavaScript error handling?
我希望開始讓我的 JavaScript 更加防錯,而且我找到了大量關於使用try
、 catch
、 finally
和throw
的文檔,但我沒有找到專家關於何時何地的大量建議拋出錯誤。
我也完全喜歡聽有精彩章節或深入解釋錯誤處理的書籍。 Eloquent JavaScript 談到了這個問題,但對這個問題不是很規范或自以為是。
感謝您提供的任何建議!
可以在https://web.archive.org/web/20140126104824/http://www.devhands.com/2008/10/javascript-error-handling-and找到一組關於企業 JavaScript 錯誤處理的非常有趣的幻燈片-一般最佳實踐/
簡而言之,它總結了:
幻燈片 go 更詳細,很可能會給您一些指導。
編輯:
上面提到的演示可以在這里找到: https://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
雅虎的 Nicholas Zakas! fame 在 Ajax Experience 2008 上做了一個關於企業錯誤處理的演講( 幻燈片),他在演講中提出了這樣的建議:
function log(sev,msg) {
var img = new Image();
img.src = "log.php?sev=" +
encodeURIComponent(sev) +
"&msg=" + encodeURIComponent(msg);
}
// usage
log(1, "Something bad happened.")
// Auto-log uncaught JS errors
window.onerror = function(msg, url, line) {
log(1, msg);
return true;
}
一年后,Nicholas Zakas 在他的博客上發布了一個更新,其中包括一個巧妙的模式,可以在您的生產環境中自動注入錯誤處理代碼(使用面向方面的編程)。
當您開始記錄 window.error 調用時,您會注意到兩件事:
減少日志條目的洪流就像在登錄到服務器之前測試嚴重性和/或隨機數一樣簡單:
function log(sev,msg) {
if (Math.random() > 0.1) return; // only log some errors
var img = new Image();
img.src = "log.php?sev=" +
encodeURIComponent(sev) +
"&msg=" + encodeURIComponent(msg);
}
處理window.error in undefined:0
錯誤取決於您的站點架構,但可以嘗試識別所有 Ajax 調用並在出現故障時拋出異常(可能使用stacktrace.js返回堆棧跟蹤)。
IHMO,您應該像使用其他幾種語言(AFAIK:Python,Java)一樣在 javascript 中使用錯誤處理。
為了更好的可讀性(可能還有更好的性能,盡管我不確定它是否真的有很大的影響),你應該主要在以下情況下使用 try / catch 塊:
您要包裝的代碼部分是整個算法的關鍵部分。 如果失敗,它可以:
您知道您正在編寫的代碼與所有瀏覽器都不兼容
最終,javascript 專家可能還有其他元素可以給出。
我的 2 美分到盒子里,
問候,
最大限度
除了其他答案:一件重要的事情是使用 JavaScript 錯誤對象和window.onerror
function 參數中可用的上下文數據。
諸如堆棧跟蹤 (errorObject.stack)、文件名、行號和列號之類的東西。 請注意,每個瀏覽器都有一些差異......因此請盡最大努力獲得良好的錯誤。
控制台 object 本身甚至可能存在問題。 我使用受此啟發的自定義 window.onerror function 和受此代碼啟發的特殊 function 來跟蹤任何給定的標准錯誤 object。
另一個好處是將 web 應用程序的版本包括在堆棧跟蹤附近的某個位置(以便快速安全地復制和粘貼)。 您還可以在開發模式下更積極地顯示錯誤(警告...),因為開發人員不會持續監視瀏覽器控制台並且可能看不到某些問題。
也可以使用 avoid using throw 'My message'
,使用throw new Error('My message')
,你甚至可以有自定義錯誤,閱讀這篇文章。
始終為錯誤添加一些上下文(版本、object 的 ID、一些自定義消息,...)並確保區分外部錯誤(某些外部數據或環境導致系統失敗)和內部錯誤/斷言(你自己的系統搞砸了),閱讀“按合同設計”。
這是指南。
還要考慮使用一般的錯誤處理,比如攔截你的庫和框架:
我為此創建了腳本。 它阻止除允許列表中提到的項目之外的所有控制台命令,或阻止阻止列表中的所有內容。 即使使用彩色控制台日志也能很好地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.