js基础---错误处理(错误监控)及调试

798 阅读2分钟

对于开发人员来说免不了和bug打交道,可以说开发人员80%的时间都在debug,也就是调试错误。

利用浏览器控制台查看错误

以chrome为例:

  • 打开chrome的控制台,查看console面板。控制台中显示着错误消息、错误的 URL 和错误的行号
  • 单击 JavaScript 控制台中的错误,就可以定位到导致错误的源代码行。

错误分类

  1. 运行错误
  2. 资源加载错误

错误捕获

  1. 代码错误捕获 捕捉一般代码错误
window.onerror=function(message,url,line){
    //错误捕获
    alert(message)
}

tip:该方法能拦截到大部分的详细报错信息,但是也有例外

* 对于跨域js文件获取是有限制的,如果想获取其他域下的js错误需要在script标签里添加crossorigin属性,
然后服务器端要设置header('Access-Control-Allow-Origin: *');
* 对于某些浏览器可能不会显示调用栈信息,这种情况可以通过 arguments.callee.caller 来做栈递归
  • 捕捉异步代码错误

比如 Promise 可以直接使用 catch 函数,async await 可以使用 try catch但是要注意线上运行的代码都是压缩过的,需要在打包时生成 sourceMap 文件便于 debug。

try{
// 可能会导致错误的代码
} catch(error){
//错误捕获
// 在错误发生时怎么处理
}

tip:与 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。

//通用错误
throw new Error("Something bad happened.");
//使用其他错误类型,也可以模拟出类似的浏览器错误
throw new SyntaxError("I don’t like your syntax.");
throw new TypeError("What type of variable do you take me for?");
throw new RangeError("Sorry, you just don’t have the range.");
throw new EvalError("That doesn’t evaluate.");
throw new URIError("Uri, is that you?");
throw new ReferenceError("You didn’t cite your references properly.");
  1. 资源加载错误捕获
  • object.onerror---img和script
var img = document.getElementById('img');

img.onerror = function () {
    //错误捕获
  console.error("资源加载错误")
}
  • performance.getEntries
  • Error时间捕获

资源加载错误不支持冒泡,但是可以捕获

window.addEventListener("error",function(e){"捕获",console.log(e)},true)

错误上报

常见错误上报有两种: ajax、image对象(推荐)

  • ajax上报就是在上文注释错误捕获的地方发起ajax请求,来向服务器发送错误信息。
  • 利用image对象
function logError(sev, msg){
    var img = new Image();
    img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg);
}

这个 logError() 函数接收两个参数:表示严重程度的数值或字符串(视所用系统而异)及错误消息。

只要是使用 try-catch 语句,就应该把相应错误记录到日志中。比如:

for (var i=0, len=mods.length; i < len; i++){
    try {
        mods[i].init();
    } catch (ex){
        logError("nonfatal", "Module init failed: " + ex.message);
    }
}