JavaScript异常监控

JavaScript异常一般可通过try catch捕获,但try catch对于延时执行的代码无法进行捕获,此时只能依靠window.onerror捕获,从中拿到错误信息。同时需要将错误信息进行统一的处理,如记录链接,并将该链接发生的错误进行统计。
try catch 和 window.onerror异常捕获已在另一篇文章说基本讲解,在此讲解捕获异常信息的详细。
开发人员比较关注:(1)当前是哪个浏览器;(2)错误信息;(3)调用堆栈;

[size=large][b]浏览器信息的获取[/b][/size]
浏览器信息存储于navigator.userAgent中

var ua = navigator.userAgent.toLowerCase(),
bom = window.ActiveXObject ? "IE" + ua.match(/msie ([d.]+)/)[1]
: document.getBoxObjectFor ? "Firefox" + ua.match(/firefox/([d.]+)/)[1]
: (ua.indexOf("chrome") != -1) ? "Chrome" + ua.match(/chrome/([d.]+)/)[1]
: window.opera ? "Opera" + ua.match(/opera.([d.]+)/)[1]
: window.openDatabase ? "Safari" + ua.match(/version/([d.]+)/)[1] : ua.replace(/s*/g, "");

正则表达式,大家都懂的,匹配的是各个浏览器下的浏览器名称及浏览器版本号

[size=large][b]错误信息[/b][/size]
信息格式:浏览器及版本号 | 链接:堆栈 | 错误信息

[size=large][b]调用堆栈[/b][/size]
思路大致是:若事件中包含stack堆栈信息,则从e.stack中获取信息;否则,如果参数arguments包含callee上级,则循环calle对象,将调用堆栈获取到;否则,只能返回空。

(function() {
function $getStack(e, d) {
if (e && e.stack) {
var s = e.stack.replace(/(?:http:)[^:]*:(.*)/g, "$1").replace(
/[ns]/g, "").replace(/@/g, "at").split("at"), l = d ? d + 1
: s.length - 1;
return s.slice(1, l).join(":");
} else if (arguments.callee.caller.caller) {
var curr = arguments.callee.caller.caller, c, o = [];
while (curr) {
c = curr;
o.push(c.toString().replace(/function/g, "Fn").replace(
/[tnr]/g, "").substring(0, 30));
curr = curr.caller;
}
return o.join(":");
} else {
return "";
}
};
function $initBadjs() {
var errorStr = "";
window.onerror = function(msg, url, l) {
var stack = $getStack(), ts = msg.replace(/n/g, " ") + "|"
+ encodeURIComponent(url + ":" + stack) + "|" + l;
if (errorStr.indexOf(ts) == -1) {
errorStr += ts + ",";
$sendBadjs(msg, url, l + ":" + stack);
}
return false;
};
}
;
function $sendBadjs(msg, src, d) {
var ua = navigator.userAgent.toLowerCase(),
bom = window.ActiveXObject ? "IE" + ua.match(/msie ([d.]+)/)[1]
: document.getBoxObjectFor ? "Firefox" + ua.match(/firefox/([d.]+)/)[1]
: (ua.indexOf("chrome") != -1) ? "Chrome" + ua.match(/chrome/([d.]+)/)[1]
: window.opera ? "Opera" + ua.match(/opera.([d.]+)/)[1]
: window.openDatabase ? "Safari" + ua.match(/version/([d.]+)/)[1] : ua.replace(/s*/g, ""),
ts = msg.replace(/n/g, " ") + "|" + encodeURIComponent(src) + "|" + d;
setTimeout(function() {
sr = document.createElement("script");
document.getElementsByTagName("head")[0].appendChild(sr);
// 此处后台可以做数据的统计及收集
sr.src = "http://42.96.169.98/projdemo/TestError?Browser=" + bom
+ "&Url=" + encodeURIComponent(location.href) + "&Content="
+ ts + "&t=" + Math.random();
}, 1000);
}
;
$initBadjs();
window._sendBadjs = $sendBadjs;
})();


[size=large][b]参考[/b][/size]
w3c onerror : http://www.w3.org/TR/2010/WD-html5-20100624/webappapis.html#handler-window-onerror
msdn onerror : http://msdn.microsoft.com/en-us/library/cc197053%28VS.85%29.aspx
firefox chrome onerror : http://stackoverflow.com/questions/5913978/cryptic-script-error-reported-in-javascript-in-chrome-and-firefox
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值