用window.onerror捕獲並上報Js錯誤的方法,window.onerrorjs

來源:互聯網
上載者:User

用window.onerror捕獲並上報Js錯誤的方法,window.onerrorjs

前兩天有個2048遊戲的使用者反饋說,開啟遊戲後不能玩兒,只有一個遊戲面板,數字無法初始化,更無法移動,裝置為iPhone 4S、iOS 5.1。嘗試從調起Safari開啟,依然不好使。由於遊戲中運用了比較多的HTML5特性,所以粗數量級估計是有JS報錯導致。不過這樣的資訊該如何捕獲到呢?當然是傳說中的window.onerror。

從W3C找到關於window.onerror的方法體介紹:

這個意思,基本可以就是說,window.onerror方法,我們可以寫成:

/**  * @param {String} errorMessage  錯誤資訊  * @param {String} scriptURI   出錯的檔案  * @param {Long}  lineNumber   出錯代碼的行號  * @param {Long}  columnNumber  出錯代碼的列號  * @param {Object} errorObj    錯誤的詳細資料,Anything  */window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) {   // TODO }

不過使用過程中還得注意相容性問題,不是所有瀏覽器都有參數列表中的所有參數,chrome之類的,都是瀏覽器標準草案的領跑者,這些個參數用就是了!

於是,可以寫一個小Demo來嘗試一下:

<!DOCTYPE html> <html> <head>   <title>Js錯誤捕獲</title>   <script type="text/javascript">   /**    * @param {String} errorMessage  錯誤資訊    * @param {String} scriptURI   出錯的檔案    * @param {Long}  lineNumber   出錯代碼的行號    * @param {Long}  columnNumber  出錯代碼的列號    * @param {Object} errorObj    錯誤的詳細資料,Anything    */   window.onerror = function(errorMessage, scriptURI, lineNumber,columnNumber,errorObj) {     console.log("錯誤資訊:" , errorMessage);     console.log("出錯檔案:" , scriptURI);     console.log("出錯行號:" , lineNumber);     console.log("出錯列號:" , columnNumber);     console.log("錯誤詳情:" , errorObj);   }   </script> </head> <body>   <script type="text/javascript" src="error.js"></script> </body> </html>

其中error.js檔案中的內容,簡單的這樣寫一句:

throw new Error("出錯了!");
用瀏覽器跑起來以後,開啟console,基本就是這樣的了:

所以,這些資料都是可以做上報的了。
當然了,上面的error.js是和html頁面同網域名稱下,如果error.js不在同域下,會是怎樣的?我們把error.js的引用改一下:

<script type="text/javascript" src="//doitbegin.duapp.com/error.js"></script>
再來開啟console,我們看到的是這樣的:

相當於window.onerror方法只捕獲到了一個errorMessage,而且是固定字串,毫無參考價值。查了點資料(Webkit源碼),發現在瀏覽器實現script資源載入的地方,是進行了同源策略判斷的,如果是非同源資源,errorMessage就被寫死為“Script error”了:

好在script標籤有一個crossorigin屬性,設定它可以顯示比較詳細的錯誤資訊,我們試著將script標籤改一下:

<script type="text/javascript" src="//doitbegin.duapp.com/error.js" crossorigin></script>
重新整理頁面,這個時候看到console中的輸出是這樣的:

出現這個error也不意外,既然設定了error.js為crossorigin,那error.js的HTTP Response Header也必須設定非同源可訪問。為了方便設定Header,把error.js做一個小改動,更名為:error-js.php。

<?php   header('Access-Control-Allow-Origin:*');   header('Content-type:text/javascript'); ?> throw new Error('出錯了'); 

此時重新整理頁面,看到console中的輸出就已經正常了,所有資訊都能正常捕獲:

OK,技術細節分析結束!我2048遊戲靜態資源是放到靜態域(非同源)下的,所以要想通過window.onerror捕獲錯誤資訊,就得按照上面的最後一種情況來操作了:

1、添加script的crossorigin屬性

2、配置一下伺服器,設定靜態資源Javascript的Response為Access-Control-Allow-Origin

您可能感興趣的文章:
  • JS對img標籤進行最佳化使用onerror顯示預設映像
  • 解析img圖片沒找到onerror事件 Stack overflow at line: 0
  • JavaScript中的onerror事件概述及使用
  • js注意img圖片的onerror事件的分析
  • 利用圖片的 onerror 事件載入預設圖片
  • img標籤中onerror用法
  • javascript window.onerror事件學習新收穫
  • window.onerror()的用法與執行個體分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.