編寫代碼只是作好項目的一小部分,寫代碼不免會碰到錯誤。所以,在項目上線後,咱們還須要主動對項目的錯誤進行收集,不能等用戶發現錯誤,再聯繫咱們,咱們再去處理。這樣很容易形成大的損失,提早作好錯誤收集和處理,能夠減小損失。html
本人並無作過相關的工做,下面的文章只是我在學習中的一點思考和總結,可能有比較多不足和錯誤的地方,但願你們指正和指導。前端
本文章爲前端進階系列的一部分,
歡迎關注和star本博客或是關注個人githubgit
先從一個面試題開始吧。騰訊第二輪電話面試的一個題目:若是用戶使用網頁,發現白屏,如今聯繫上了大家,大家會向他詢問什麼信息呢?github
<!-- more -->
一個個去堆答案沒有意思,咱們換個思路,先想一下爲何會白屏?web
跟我以前的性能優化的文章同樣,咱們以用戶訪問頁面的過程爲順序,大體排查一下面試
經過以上可能發生錯誤的環節,咱們須要向用戶手機一下如下的用戶信息ajax
如今話題來到了如何收集錯誤信息了。chrome
前端錯誤收集有兩大流派:後端
一個是虛擬機監控,優勢是指標齊全,而且能夠進行競品監控,缺點是反映不全,容易失真跨域
另外一個是腳本監控,優勢是能夠收集海量真實數據,缺點是影響性能,採樣少的狀況下容易失真。
這裏暫時只講腳本監控(挖個坑,以後可能填)
在chrome瀏覽器控制檯輸入Performance.timing,會獲得記錄了一個瀏覽器訪問各階段的時間的對象。
進行錯誤收集的時候,能夠對比這些時間,看錯誤發生在什麼階段
記錄訪問開始的時間可有如下的方法:
記錄訪問過程的時間
window.onerror能夠捕捉運行時錯誤,能夠拿到出錯的信息,堆棧,出錯的文件、行號、列號
要注意如下幾點:
promise除了使用catch方法來捕獲錯誤,還可使用window的unhandledrejection事件捕獲異常的
window.addEventListener("unhandledrejection", function(e){ // Event新增屬性 // @prop {Promise} promise - 狀態爲rejected的Promise實例 // @prop {String|Object} reason - 異常信息或rejected的內容 // 會阻止異常繼續拋出,不讓Uncaught(in promise) Error產生 e.preventDefault() })
沒法捕捉到語法錯誤,只能捕捉運行時錯誤;
能夠拿到出錯的信息,堆棧,出錯的文件、行號、列號; 須要藉助工具把全部的function塊以及文件塊加入try,catch,能夠在這個階段打入更多的靜態信息。
要注意的是try catch只能捕獲同步代碼的異常,對回調,setTimeout,promise等無能爲力
function report(error) { var reportUrl = 'http://xxxx/report'; new Image().src = reportUrl + 'error=' + error; }
本文章爲前端進階系列的一部分,
歡迎關注和star本博客或是關注個人github