17 April 2015

###onerror vs try-catch

/*[export]*/
/*
 * filename:    index.js
 * author:  shalles
 * E-mail:  shalles@163.com
 * CreateTime:  2015-04-17 10:36:18
*/

//onerror全局错误捕获处理函数,会终止同步代码
window.onerror=function(e){
    console.log("catch a error")
}

//异步测试代码
setTimeout(function(){
    console.log("The async code before an error code could execute normal yet")
}, 1000);

//带有错误的测试代码
function errorCode(){
    for (var i = Things.length - 1; i >= 0; i--) {
        Things[i]
    };
}

//*/
//catch中没有错误则不会终止代码
try{
    errorCode();
} catch(e){
    //添加处理异常代码

    //throw Error("error create in try catch, but you can named it free")
    
    //添加报警代码
    console.log("catch by try-catch");
}
/*/
errorCode();
//*/

//使用try catch捕获前面的错误后, 后面的代码可以正常执行
//而onerror捕获的则不会执行,且使用try catch捕获到的错误
//不会再被onerror捕获。
console.log("the code after error also run to here");

因此为了兼顾到onerror提供信息全面的优势,和try catch捕 获错误而不干扰后续代码的执行, 又兼顾try catch捕获到的 错误不会再被onerror捕获。那我们该怎么做呢? 其实我们分开来想问题, try catch主要是捕获一些我们能预 想到的错误即异常。并在catch中可嵌套的添加备用方案。 window.onerror主要是用来捕获一些运行时预料不到的问题, 当然try-catch也会捕获到不在预料中的问题, 人总有疏忽。 那现在他们有了共同点,就是可以捕获没有预料到的问题, 这 也是为什么要写这个测试《onerror vs try-catch》的目的。 其实没有那个更好,因为他们目的没有多少交集。在写代码时 有备选方案(某段代码错了就错了不影响后续执行的, 此时的 catch不处理也是一种备选方案) 的该处理的异常还是用try- catch处理, 在加监控时要捕获全局错误的需要详细错误信息 的还是用window.onerror, 互不干扰。为了监控的话,折中的 我们在catch中也阔以把一些错误发送给监控。