深入分析javascript中的错误处理机制

  错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验。由于任何javascript错误都可能导致网页无法使用,因此作为开发人员,必须要知道何时可能出错,为什么会出错,以及会出什么错。本文将详细介绍javascript中的错误处理机制

error对象

  error对象是包含错误信息的对象,是javascript的原生对象。当代码解析或运行时发生错误,javascript引擎就会自动产生并抛出一个error对象的实例,然后整个程序就中断在发生错误的地方

console.log(t);//Uncaught ReferenceError: t is not defined

  ECMA-262规定了error对象包括两个属性:message和name。message属性保存着错误信息,而name属性保存错误类型

复制代码 代码如下:


//一般地,使用try-catch语句来捕获错误
try{
    t;
}catch(ex){
    console.log(ex.message);//t is not defined
    console.log(ex.name);//ReferenceError
}


  浏览器还对error对象的属性做了扩展,添加了其他相关信息。其中各浏览器厂商实现最多的是stack属性,它表示栈跟踪信息(safari不支持)

复制代码 代码如下:


try{
    t;
}catch(ex){
    console.log(ex.stack);//@file:///D:/wamp/www/form.html:12:2
}


  当然,可以使用error()构造函数来创建错误对象。如果指定message参数,则该error对象将把它用做它的message属性;若不指定,它将使用一个预定义的默认字符串作为该属性的值

复制代码 代码如下:


new Error();
new Error(message);   
//一般地,使用throw语句来抛出错误
throw new Error('test');//Uncaught Error: test
throw new Error();//Uncaught Error


复制代码 代码如下:


function UserError(message) {
   this.message = message;
   this.name = "UserError";
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
throw new UserError("errorMessage");//Uncaught UserError: errorMessage


  当不使用new操作符,直接将Error()构造函数像一个函数一样调用时,它的行为和带new操作符调用时一样

复制代码 代码如下:


Error();
Error(message);   
throw Error('test');//Uncaught Error: test
throw Error();//Uncaught Error


  error对象有一个toString()方法,返回'Error:'+ error对象的message属性

复制代码 代码如下:


var test = new Error('testError');
console.log(test.toString());//'Error: testError'

error类型

  执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。ECMA-262定义了下列7种错误类型:

复制代码 代码如下:


Error
EvalError(eval错误)
RangeError(范围错误)
ReferenceError(引用错误)
SyntaxError(语法错误)
TypeError(类型错误)
URIError(URI错误)


  其中,Error是基类型,其他错误类型都继承自该类型。因此,所有错误类型共享了一组相同的属性。Error类型的错误很少见,如果有也是浏览器抛出的;这个基类型的主要目的是供开发人员抛出自定义错误

【EvalError(eval错误)】

  eval函数没有被正确执行时,会抛出EvalError错误。该错误类型已经不再在ES5中出现了,只是为了保证与以前代码兼容,才继续保留

【RangeError(范围错误)】

  RangeError类型的错误会在一个值超出相应范围时触发,主要包括超出数组长度范围以及超出数字取值范围等

复制代码 代码如下:


new Array(-1);//Uncaught RangeError: Invalid array length
new Array(Number.MAX_VALUE);//Uncaught RangeError: Invalid array length

(1234).toExponential(21);//Uncaught RangeError: toExponential() argument must be between 0 and 20
(1234).toExponential(-1);////Uncaught RangeError: toExponential() argument must be between 0 and 20


【ReferenceError(引用错误)】

  引用一个不存在的变量或左值(lvalue)类型错误时,会触发ReferenceError(引用错误)

a;//Uncaught ReferenceError: a is not defined
1++;//Uncaught ReferenceError: Invalid left-hand side expression in postfix operation
【SyntaxError(语法错误)】

  当不符合语法规则时,会抛出SyntaxError(语法错误)

复制代码 代码如下:


//变量名错误
var 1a;//Uncaught SyntaxError: Unexpected number
// 缺少括号
console.log 'hello');//Uncaught SyntaxError: Unexpected string


【TypeError(类型错误)】

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzswzz.html