JavaScript 错误类型

JavaScript 中的 7 种内置错误类型及其触发场景

问题

JavaScript 中有哪些错误类型?分别在什么情况下触发?

解答

JavaScript 提供了 7 种内置错误类型,所有错误类型都继承自 Error

Error

最基本的错误类型,其他错误类型都继承自它。通常用于开发者自定义错误:

throw new Error('自定义错误信息');

EvalError

使用 eval() 函数时发生异常抛出。当 eval 被当作构造函数或被重新赋值时触发:

new eval(); // EvalError
eval = foo; // EvalError

实际开发中很少遇到,因为 eval 本身使用就不多。

RangeError

数值超出有效范围时触发:

new Array(-1); // 负数长度
new Array(4294967296); // 超过最大长度

// 递归爆栈也会触发
function recursion() {
  recursion();
}
recursion(); // RangeError: Maximum call stack size exceeded

ReferenceError

访问未声明的变量时触发:

var a = b; // Uncaught ReferenceError: b is not defined
console.log(undefinedVar); // ReferenceError

SyntaxError

代码不符合语法规范时触发,通常在解析阶段就会报错:

var a = ; // SyntaxError: Unexpected token
if (true { } // SyntaxError: Unexpected token

TypeError

变量类型不符合操作要求时触发,是最常见的错误之一:

var o = new 10; // TypeError: 10 is not a constructor

var a = null;
a.style.width = "10px"; // TypeError: Cannot read property 'style' of null

新手常见场景:获取不到 DOM 元素就操作其属性。

URIError

URI 编码/解码函数的参数格式不正确时触发:

decodeURI('%'); // URIError: URI malformed

实际开发中很少遇到。

关键点

  • 所有错误类型都继承自 Error,共享相同的属性结构
  • TypeErrorReferenceError 是开发中最常见的两种错误
  • RangeError 除了数值范围问题,递归爆栈也会触发
  • SyntaxError 在代码解析阶段就会抛出,无法被 try-catch 捕获(运行时语法错误除外)
  • 操作 DOM 前要确保元素存在,避免 TypeError