<script type="text/javascript">
window.onerror = function(msg, url, line, col, error, errorObject) {
console.log('msg', msg);
console.log('url', url);
console.log('line', line);
console.log('col', col);
console.log('error', error);
console.log('errorObject', errorObject);
//沒有URL不上報!上報也不知道錯誤
if (msg != "Script error." && !url) {
return true;
}
//采用異步的方式
//我遇到過在window.onunload進行ajax的堵塞上報
//由于客戶端強制關(guān)閉webview導(dǎo)致這次堵塞上報有Network Error
//我猜測這里window.onerror的執(zhí)行流在關(guān)閉前是必然執(zhí)行的
//而離開文章之后的上報對于業(yè)務(wù)來說是可丟失的
//所以我把這里的執(zhí)行流放到異步事件去執(zhí)行
//腳本的異常數(shù)降低了10倍
setTimeout(function() {
var data = {};
//不一定所有瀏覽器都支持col參數(shù)
col = col || (window.event && window.event.errorCharacter) || 0;
data.url = url;
data.line = line;
data.col = col;
if (!!error && !!error.stack) {
//如果瀏覽器有堆棧信息
//直接使用
data.msg = error.stack.toString();
} else if (!!arguments.callee) {
//嘗試通過callee拿堆棧信息
var ext = [];
var f = arguments.callee.caller,
c = 3;
//這里只拿三層堆棧信息
while (f && (--c > 0)) {
ext.push(f.toString());
if (f === f.caller) {
break; //如果有環(huán)
}
f = f.caller;
}
ext = ext.join(",");
data.msg = ext;
}
//把data上報到后臺!
console.log('errorData', data);
}, 0);
return false;
};
</script>
目前打包成一行的js文件錯誤位置不好定位,如果使用try_catch 回調(diào)函數(shù)中錯誤捕捉不到,可以window.onerror配合著try_catch 使用,抓取錯誤信息。