这篇文章将为大家详细讲解有关JavaScript中错误异常的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
我的建议是不要隐藏错误,勇敢地抛出来。没有人会因为代码出现错误导致程序崩溃而羞耻,我们可以让程序中断,让用户重来。错误是无法避免的,如何去处理它才是最重要的。
JavaScript提供一套错误处理机制,错误是干扰程序正常流程的非正常的事故。而没人可以保持程序没有bug,那么上线后遇到特殊的错误,如何更快的定位问题所在呢?这就是我们这个专题需要讨论的问题。
下面会从JavaScript错误基础知识,如何拦截和捕获异常,如何方便的在线上报错误等方面来叙述,本人也是根据网上的知识点进行了一些总结和分析(我只是互联网的搬运工,不是创造者),如果有什么错漏的情况,请在问题上狠狠的批评我。
这个专题目前是针对浏览器的,还没考虑到节点。js,不过都是JavaScript Es6语法,大同小异。
什么时候JavaScript会抛出错误呢?
一般分为两种情况:
JavaScript自带错误
开发者主动抛出的错误
<强> JavaScript引擎自动抛出的错误强>
大多数场景下我们遇到的错误都是这类错误。如果发生Javscript语法错误,代码引用错误,类型错误等,JavaScript引擎就会自动触发此类错误。如下一些场景:
场景一
console.log (a.notExited)//浏览器会抛出未捕获ReferenceError:一个没有定义
场景二
常量;//浏览器抛出未捕获SyntaxError:失踪的初始化在常量声明
语法错误,浏览器一般第一时间就抛出错误,不会等到执行的时候才会报错。
场景三
让数据; data.forEach (v=在{})//未捕获TypeError:无法读取属性& # 39;foreach # 39;未定义的
手动抛出的错误
一般都是类库开发的自定义错误异常(如参数等不合法的错误异常抛出),或者重新修改错误消息进行上报,以方便理解。
场景一
函数sum (a, b) { 如果(typeof !==& # 39;数字# 39;){ 把TypeError(& # 39;预计数量是一个# 39;公司); } 如果(typeof b !==& # 39;数字# 39;){ 把TypeError(& # 39;预期b是一个号码# 39;公司); } 返回一个+ b; } 总和(& # 39;d # 39;);//浏览器抛出未捕获TypeError:预期b是一个数字。
场景二
当然我们不一定需要这样做。
让数据; 尝试{ 数据。forEach (v=比;{}); }捕捉(错误){ 错误。消息=& # 39;数据没有定义,数据必须是数组强生# 39;; error.name=& # 39; DataTypeError& # 39;; 把错误; }
如何创建误差对象?
创建语法如下:
新的错误([消息[文件名,lineNumber]])
省略新的语法也一样。
其中文件名和lineNumber不是所有浏览器都兼容的,谷歌也不支持,所以可以忽略。
错误构造函数是通用错误类型,除了错误类型,还有TypeError, RangeError等类型。
错误实例
这里列举的都是错误层的原型链属性和方法,更深层的原型链的继承属性和方便不做说明。一些有兼容性的而且不常用的属性和方法不做说明。
console.log (Error.prototype)//浏览器输出{构造函数:?,名字:“Error",信息:““,toString: ?}
其他错误类型构造函数是继承错误,实例是一致的。
属性
Error.prototype。消息
错误信息,错误(“msg")。信息===癿sg"。
Error.prototype.name
错误类型(名字),错误(“msg") . name===按砦蟆薄H绻荰ypeError,那么名字为TypeError。
Error.prototype。堆栈
错误对象作为一个非标准的栈属性提供了一种函数追踪方式,无论这个函数被被调用,处于什么模式,来自于哪一行或者哪个文件,有着什么样的参数。这个栈产生于最近一次调用最早的那次调用,返回原始的全局作用域调用。
这个不是规范,存在兼容性。经测试,谷歌,火狐,边缘,回历2月都支持此特性(都是在最新的版本下测试2019-04-02),即不支持。
方法
Error.prototype.constructor
Error.prototype。toString
返回值格式为${名称}:{消息}美元。
<强>常用错误类型强>
除了通用的错误构造函数外,JavaScript还有常见的5个其他类型的错误构造函数。