js高级程序设计-17章错误处理与调试
try-catch 语句
这个东西和 java 一模一样
我们可以通过 error.message 来打印错误信息。(只有这个是所有的浏览器都实现的)
其他的浏览器还有比如 linenumber,stack 等等来存储错误信息,但是各个浏览器的兼容不一样。
finally 语句
finally 语句是一定会执行的,无论 try 或者 catch 里面有什么,哪怕是return
,都会被忽略。有了 finally,catch 就是可选的了。(ie7 下有个小 bug,所以最好还是写)
错误类型
每种错误都有对应的错误类型,下面 7 种
- Error
这是个基类型的错误,很少会有,一般就是浏览器抛出或者供开发人员来自定义
- EvalError
书上说是没有把 eval()当做函数调用就会报这个错,然后我使用的比较高级的 chrome 和 ff 已经不会报这个错了。
- RangeError
数值超过了范围,比如给 array 一个负值的 length 或者无穷大的 length
- ReferenceError
找不到对象,如果访问没有定义的对象的话就会报这个错误。
- SyntaxError
这个问题一般就是编译错误了,肯定哪里少了个分号或者逗号之类的。
- TypeError
执行基于特定类型的操作,变量的类型不符合要求,比如想从一数值中访问属性等等。
- URIError
使用 encodeURI 或者 decodeURI,当格式不对时,就会遇到这个错误,一般也不会发生。
根据错误类型特别的处理
如下使用 instanceof 来看这个错误是属于哪个类型的
try {
} catch (e) {
if (e instanceof TypeError) {
} else if (e instanceof ReferenceError) {
}
}
抛出错误
throw 语句
随便抛出什么都行,任何类型
也可以 throw new Error(‘message’),也可以随便找个 error 种类。
也可以通过原型链重写 error,重写 name 和 message 属性。
error 事件
没有通过 try catch 捕获的 error 都会触发 window 的 error 事件,但是 opera 和 safari 不支持。这个监听接受三个参数。
window.onerror = function(message, url, line) {
alert(message);
return false; //这句可以组织浏览器报告错误的默认行为
};
这个事件的浏览器处理方式明显不同。IE 会代码正常执行,ff 下常规会停止执行。
图像也支持 error 事件,只要图像的 src 的 URL 返回的不能被识别的图像格式,就会触发 error 事件,此时遵循 DOM 格式,返回一个 error。
常见的错误
比如判断语句
if (str) {
//这里很容易出错,因为str如果为0的话,也不会执行,这里可能就会需要再用typeof判断下类型
}
这里的数据类型错误告诉我们:
也许在与后端定接口的时候不需要太完备的类型检测,但是如果是面对公众的api一定要`无条件的进行类型检测`
要注意区分下错误是否致命,比如是否会挂掉整个的 js,影响到其他模块的执行。
建立错误记录系统
这里有个解决方案,使用 img 来发请求记录这个错误的信息,与我曾经给 zepto 加的打点一样的。img 基本是个浏览器都是支持的,而且避免跨域限制。
function logError(sev, msg) {
var img = new Image();
img.src = "log.php?svg" + encodeURIComponent(sev) + "&msg=" + encodeURIComponent(msg);
}
调试技巧
就是 alert 和 console
还有种控制 java 控制台的写法,不过比较麻烦,何必呢。。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com
文章标题:js高级程序设计-17章错误处理与调试
文章字数:884
本文作者:泽鹿
发布时间:2019-08-28, 16:45:23
最后更新:2019-08-28, 16:45:23
原始链接:http://panyifei.github.io/2019/08/28/读书笔记/Javascript高级程序设计/17错误处理与调试/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。