善用window.onerror充当全局try-catch处理异常

3分实现功能7分异常。我们每天都在用标准库、用别人的库也自己写库给别人用,异常处理做的好就是好库。javascript开发时try-catch是很好的捕获异常并处理异常的方式,把那些类型转换失败、数组溢出等可能出现的异常导致的卡死崩溃用另一种方式处理掉。为可能出现异常的代码块用try-catch包起来这当然是个好习惯,可是毕竟异常说来就来、想来就来,18种花样给你惊喜,总有漏网之鱼你就没打上try-catch就出事了。所以你需要找个能帮你“兜底”的人,就是window对象的error事件。
可以如图中这么写:

/**
*@param message 错误的描述
*@param url 错误所在的文件url
*@param line 错误所在的行
*/
window.onerror = function (message,url,line) {
  alert(message);//这里写上自己的处理逻辑
  return false;
}

window的error会在任何没有用try-catch处理的异常发生时触发。这个事件可以充当整个文档的try-catch,是避免由浏览器报错的最后一道防线,这么做就有人帮你“兜底”了,就是个闭环了,你才能自信地说"放心,所有异常我都有处理"。
ps:image对象也有error事件,比如当src指向的图片url不对时,就会触发error事件,你可以在事件处理程序里提供一个默认图片,或者提示加载出错等等。

另外,说到javascript的异常处理,自己开发还要多注意以下2点:
1、用别人的库时不要太信任它。用它的函数时都尽量用try-catch包起来。
2、同样,自己写库的时候要注意该抛异常就抛,别不处理。throw new Error(...)会让你的库更友好。

/**
 * @desc 数组元素去重
 * @param {Array} arr1
 * @return {Array} 去重后的数组
 */
function arrayNoRepeat(arr) {
    if(arr instanceof Array) {        //先检查入参是不是数组,不是的话则抛个异常出去
        return [... new Set(arr)]
    }
    else {
        throw new Error("Unable to operat! Its type isn't Array.");
    }
}

上面,如果入参不是数组的话别简单的直接return,虽然程序没有什么问题,但是这个时候调用者就懵逼了,他没看到结果以为你函数写错了呢。相反你给他抛个数组类型的异常出去,告诉他参数传错了。如果你这么做了可以很大程度上指导他们注意要传正确的参数,心底会对你的函数更信任,而且当异常发生时他们会下意识地认为是他们自己的错,而是自己不会用。

你可能感兴趣的:(善用window.onerror充当全局try-catch处理异常)