<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        捕獲和分析JavaScriptError的方法_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 21:21:08
        文檔

        捕獲和分析JavaScriptError的方法_javascript技巧

        捕獲和分析JavaScriptError的方法_javascript技巧:如何捕獲和分析 JavaScript Error 前端工程師都知道 JavaScript 有基本的異常處理能力。我們可以 throw new Error(),瀏覽器也會在我們調用 API 出錯時拋出異常。但估計絕大多數前端工程師都沒考慮過收集這些異常信息。反正只要 JavaScript 出錯
        推薦度:
        導讀捕獲和分析JavaScriptError的方法_javascript技巧:如何捕獲和分析 JavaScript Error 前端工程師都知道 JavaScript 有基本的異常處理能力。我們可以 throw new Error(),瀏覽器也會在我們調用 API 出錯時拋出異常。但估計絕大多數前端工程師都沒考慮過收集這些異常信息。反正只要 JavaScript 出錯
        如何捕獲和分析 JavaScript Error

        前端工程師都知道 JavaScript 有基本的異常處理能力。我們可以 throw new Error(),瀏覽器也會在我們調用 API 出錯時拋出異常。但估計絕大多數前端工程師都沒考慮過收集這些異常信息。反正只要 JavaScript 出錯后刷新不復現,那用戶就可以通過刷新解決問題,瀏覽器不會崩潰,當沒有發(fā)生過好了。這種假設在 Single Page App 流行之前還是成立的。現在的 Single Page App 運行一段時間后狀態(tài)復雜無比,用戶可能進行了若干輸入操作才來到這里的,說刷新就刷新啊?之前的操作豈不要完全重做?所以我們還是有必要捕獲和分析這些異常信息的,然后我們就可以修改代碼避免影響用戶體驗。
        捕獲異常的方式

        我們自己寫的 throw new Error() 想要捕獲當然可以捕獲,因為我們很清楚 throw 寫在哪里了。但是調用瀏覽器 API 時發(fā)生的異常就不一定那么容易捕獲了,有些 API 在標準里就寫著會拋出異常,有些 API 只有個別瀏覽器因為實現差異或者有缺陷而拋出異常。對于前者我們還能通過 try-catch 捕獲,對于后者我們必須監(jiān)聽全局的異常然后捕獲。

        try-catch

        如果有些瀏覽器 API 是已知會拋出異常的,那我們就需要把調用放到 try-catch 里面,避免因為出錯而導致整個程序進入非法狀態(tài)。例如說 window.localStorage 就是這樣的一個 API,在寫入數據超過容量限制后就會拋出異常,在 Safari 的隱私瀏覽模式下也會如此。
        代碼如下:
        try {
        localStorage.setItem('date', Date.now());
        } catch (error) {
        reportError(error);
        }

        另一個常見的 try-catch 適用場景是回調。因為回調函數的代碼是我們不可控的,代碼質量如何,會不會調用其它會拋出異常的 API,我們一概不知道。為了不要因為回調出錯而導致調用回調后的其它代碼無法執(zhí)行,所以把調用回到放到 try-catch 里面是必須的。
        代碼如下:
        listeners.forEach(function(listener) {
        try {
        listener();
        } catch (error) {
        reportError(error);
        }
        });

        window.onerror

        對于 try-catch 覆蓋不到的地方,如果出現異常就只能通過 window.onerror 來捕獲了。
        代碼如下:
        window.onerror =
        function(errorMessage, scriptURI, lineNumber) {
        reportError({
        message: errorMessage,
        script: scriptURI,
        line: lineNumber
        });
        }

        注意不要耍小聰明使用 window.addEventListener 或 window.attachEvent 的形式去監(jiān)聽 window.onerror。很多瀏覽器只實現了 window.onerror,或者是只有 window.onerror 的實現是標準的。考慮到標準草案定義的也是 window.onerror,我們使用 window.onerror 就好了。
        屬性丟失

        假設我們有一個 reportError 函數用來收集捕獲到的異常,然后批量發(fā)送到服務器端存儲以便查詢分析,那么我們會想要收集哪些信息呢?比較有用的信息包括:錯誤類型(name)、錯誤消息(message)、腳本文件地址(script)、行號(line)、列號(column)、堆棧跟蹤(stack)。如果一個異常是通過 try-catch 捕獲到的,這些信息都在 Error 對象上(主流瀏覽器都支持),所以 reportError 也能收集到這些信息。但如果是通過 window.onerror 捕獲到的,我們都知道這個事件函數只有 3 個參數,所以這 3 個參數以外的信息就丟失了。
        序列化消息

        如果 Error 對象是我們自己創(chuàng)建的話,那么 error.message 就是由我們控制的。基本上我們把什么放進 error.message 里面,window.onerror 的第一個參數(message)就會是什么。(瀏覽器其實會略作修改,例如加上 'Uncaught Error: ' 前綴。)因此我們可以把我們關注的屬性序列化(例如 JSON.Stringify)后存放到 error.message 里面,然后在 window.onerror 讀取出來反序列化就可以了。當然,這僅限于我們自己創(chuàng)建的 Error 對象。
        第五個參數

        瀏覽器廠商也知道大家在使用 window.onerror 時受到的限制,所以開始往 window.onerror 上面添加新的參數。考慮到只有行號沒有列號好像不是很對稱的樣子,IE 首先把列號加上了,放在第四個參數。然而大家更關心的是能否拿到完整的堆棧,于是 Firefox 說不如把堆棧放在第五個參數吧。但 Chrome 說那還不如把整個 Error 對象放在第五個參數,大家想讀取什么屬性都可以了,包括自定義屬性。結果由于 Chrome 動作比較快,在 Chrome 30 實現了新的 window.onerror 簽名,導致標準草案也就跟著這樣寫了。
        代碼如下:
        window.onerror = function(
        errorMessage,
        scriptURI,
        lineNumber,
        columnNumber,
        error
        ) {
        if (error) {
        reportError(error);
        } else {
        reportError({
        message: errorMessage,
        script: scriptURI,
        line: lineNumber,
        column: columnNumber
        });
        }
        }

        屬性正規(guī)化

        我們之前討論到的 Error 對象屬性,其名稱都是基于 Chrome 命名方式的,然而不同瀏覽器對 Error 對象屬性的命名方式各不相同,例如腳本文件地址在 Chrome 叫做 script 但在 Firefox 叫做 filename。因此,我們還需要一個專門的函數來對 Error 對象進行正規(guī)化處理,也就是把不同的屬性名稱都映射到統(tǒng)一的屬性名稱上。具體做法可以參考這篇文章。盡管瀏覽器實現會更新,但人手維護一份這樣的映射表并不會太難。

        類似的是堆棧跟蹤(stack)的格式。這個屬性以純文本的形式保存一份異常在發(fā)生時的堆棧信息,由于各個瀏覽器使用的文本格式不一樣,所以也需要人手維護一份正則表達,用于從純文本中提取每一幀的函數名(identifier)、文件(script)、行號(line)和列號(column)。
        安全限制

        如果你也遇到過消息為 'Script error.' 的錯誤,你會明白我在說什么的,這其實是瀏覽器針對不同源(origin)腳本文件的限制。這個安全限制的理由是這樣的:假設一家網銀在用戶登錄后返回的 HTML 跟匿名用戶看到的 HTML 不一樣,一個第三方網站就能把這家網銀的 URI 放到 script.src 屬性里面。HTML 當然不可能被當做 JS 解析啦,所以瀏覽器會拋出異常,而這個第三方網站就能通過解析異常的位置來判斷用戶是否有登錄。為此瀏覽器對于不同源腳本文件拋出的異常一律進行過濾,過濾得只剩下 'Script error.' 這樣一條不變的消息,其它屬性統(tǒng)統(tǒng)消失。

        對于有一定規(guī)模的網站來說,腳本文件放在 CDN 上,不同源是很正常的。現在就算是自己做個小網站,常見框架如 jQuery 和 Backbone 都能直接引用公共 CDN 上的版本,加速用戶下載。所以這個安全限制確實造成了一些麻煩,導致我們從 Chrome 和 Firefox 收集到的異常信息都是無用的 'Script error.'。
        CORS

        想要繞過這個限制,只要保證腳本文件和頁面本身同源即可。但把腳本文件放在不經 CDN 加速的服務器上,豈不降低用戶下載速度?一個解決方案是,腳本文件繼續(xù)放在 CDN 上,利用 XMLHttpRequest 通過 CORS 把內容下載回來,再創(chuàng)建

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        捕獲和分析JavaScriptError的方法_javascript技巧

        捕獲和分析JavaScriptError的方法_javascript技巧:如何捕獲和分析 JavaScript Error 前端工程師都知道 JavaScript 有基本的異常處理能力。我們可以 throw new Error(),瀏覽器也會在我們調用 API 出錯時拋出異常。但估計絕大多數前端工程師都沒考慮過收集這些異常信息。反正只要 JavaScript 出錯
        推薦度:
        標簽: 技巧 錯誤 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产福利在线免费| 秋霞人成在线观看免费视频 | 国产精品亚洲精品日韩动图| 手机在线看永久av片免费| 亚洲网站视频在线观看| 少妇无码一区二区三区免费| 亚洲av网址在线观看| 91精品全国免费观看含羞草| 久久夜色精品国产噜噜噜亚洲AV| 一级特黄aa毛片免费观看| 久久久久久亚洲Av无码精品专口 | 五月婷婷亚洲综合| 特黄aa级毛片免费视频播放| 国产免费爽爽视频免费可以看| 亚洲av无码片vr一区二区三区 | 最好免费观看韩国+日本| 亚洲乱人伦中文字幕无码| 国产一区视频在线免费观看 | 毛片在线播放免费观看| 亚洲黄色在线观看视频| 日本XXX黄区免费看| 亚洲欧洲免费无码| 亚洲AV无码不卡在线观看下载| 伊人久久大香线蕉免费视频| 久久久久亚洲AV成人片| 成人毛片免费网站| 日日躁狠狠躁狠狠爱免费视频| 亚洲AV无码1区2区久久| 青苹果乐园免费高清在线| 羞羞漫画小舞被黄漫免费| 亚洲精品高清国产一线久久| 久草视频免费在线| 日韩在线视频播放免费视频完整版 | 久久精品中文字幕免费| 国产精品亚洲综合五月天| 免费观看午夜在线欧差毛片| 国产无遮挡无码视频免费软件| 亚洲无人区码一二三码区别图片| 亚洲AⅤ永久无码精品AA| 91大神免费观看| 免费国产在线精品一区|