JavaScript中的BUG
什么叫BUG
bug是计算机领域专业术语,bug原意是“臭虫”,现在用来指代计算机上存在的漏洞。
bug狭义的概念是指软件程序漏洞或缺陷,广义的概念还包括测试工程师或用户所发现和提出的软件可更改的细节、或与需求文档存在差异的功能实现等。
在JS中的BUG简单点来说就是程序运行的时候出错,或者是程序运行后的结果没有达到我们预期效果。
名称的由来
马克2号(Harvard Mark II)编制程序的格蕾丝·赫柏(Grace Murray Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一,有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍波诙谐的把程序故障统称为BUG(飞虫),把排除程序故障叫DEBUG,而这奇怪的“称呼”,后来成为计算机领域的专业行话。
原因和危害
原因是系统安全策略上存在的缺陷,危害是有攻击者能够在未授权的情况下访问的危害。
JS中BUG的类型
js中在控制台出现报错的信息只要分为两类。
一类是语法报错,会导致整个JS文件无法执行,该类一般在预编译的时候就会在控制台出现报错提示
另一类称为异常报错,会导致报错及以后的代码无法执行,之前的代码不会受到影响
下面6中派生错误,连同原始的Error对象,都是构造函数,开发者也可以使用,人为的来生成一些错误对象的列子
-
语法错误
SyntaxError
:命名不规范,关键字使用错误,输入法未切换
-
引用错误
ReferenceError
:引用了不存在的变量、给无法赋值的对象赋值
-
范围错误
RangeError
:某个值超出了有限范围,例如数组长度为负数、Number对象方法的参数超出范围、函数递归没有出口时导致栈超出最大值
-
类型错误
TypeError
:变量或者参数不是预期类型。例如调用不存在的方法、new关键字接基本类型
-
URIError
:URL错误,函数传参错误
-
EvalError
:Eval错误 ES5以下,当eval()函数没有被正确执行时,会抛出的错误
var myEval = eval;
myEval("alert('call eval')");
虽然ES5以上的JS中已经不再抛出该错误,但是依旧可以通过new关键字自定义该类型的错误
JavaScript中的异常处理语句
1.处理错误
即使程序发生错误,也能保证程序不异常中断的一种机制。
错误在JS中本质上也是一个对象,所以我们也可以通过new Error来创造错误对象。
2. 捕获错误
try{
... //异常的抛出
}catch(e){
... //异常的捕获与处理
}finally{
... //结束处理
}
JS里异常处理的有两个特点:
1、活动链域和性能
当对异常进行捕获并进入到 catch 块中,此时的异常对象 e 将成为一个新的活动对象,并提到活动链域的最前面。如下例子:
try{
...
}catch(e){
var name = 'jberry';
alert(name + e.message); //e 在活动链域的最前面 //handleFn(e);}
此时 catch 块中的任何标识符(例子中的 ‘name’)都将在活动链域的第二个活动对象里访问,这样降低了访问的性能。好的方法的是调用异常处理函数,减少在catch块中对标识符的访问(例子中 handleFn(e);
)。
2、错误和异常有什么区别?
在如Java一些语言中,错误和异常有所区别,它们分属不同的类别。
通常错误是非正常的系统级的严重错误,出现后程序直接终止,这种错误是不应该、或是不可预见的,不推荐用 try-catch 来捕获处理。
异常是程序运行时不满足某些条件而出现的非严重的错误,应尽量使用 try-catch 来捕获它。
而在JS中,只定义了错误(Error),作为其内置的对象,其原型对象一般包括 name 和 message 两个属性。不同的浏览器还实现了不同的错误类型以及附加的属性和方法。
异常(Exception)只是错误的另一种说法,它们实际上一个东西,都可以用 try-catch 来处理,因此不用在意它们的处理方式。一个异常的对象,在JS里实际上就是一个拥有 name 和 message 属性的Error实例罢了。
唯一不同的是,如上面所述,JS中异常可以以字符串、数字、布尔值或对象的形式来抛出处理,而错误则通常特指Error对象及其继承的自定义子对象。