JavaScript基础:错误类型
JavaScript基础:错误类型

JavaScript 提供了一些内置的异常类型,在代码运行时捕获并处理错误。这些异常类型可以帮助我们理解代码中可能发生的问题,提供适当的错误处理机制。

1. Error (基础错误类型)

Error 是 JavaScript 中所有错误类型的基类。可以通过 Error 构造函数来创建自定义错误消息。大多数异常类型都是 Error 的派生类型。

示例代码:
try {
  throw new Error('这是一个自定义错误');
} catch (error) {
  console.error(error.name);    // Error
  console.error(error.message); // 这是一个自定义错误
}
用途:
  • 当我们需要定义自定义错误时,可以使用 Error 类。
  • Error 类通常作为所有错误类型的基类,是 JavaScript 错误处理机制的核心。

2. ReferenceError (引用错误)

ReferenceError 在尝试访问未定义的变量时抛出。例如,调用一个未声明的变量或函数时,JavaScript 会抛出 ReferenceError

示例代码:
try {
  console.log(nonExistentVariable); // 尝试访问未定义变量
} catch (error) {
  console.error(error.name);    // ReferenceError
  console.error(error.message); // nonExistentVariable is not defined
}
用途:
  • 捕捉代码中引用不存在的变量或函数的错误。
  • ReferenceError 通常出现在拼写错误或变量声明不当的情况下。
解决方法:
  • 确保所有变量和函数在使用之前已声明并初始化。
  • 使用 letconst 来避免变量提升带来的不确定性。

3. TypeError (类型错误)

TypeError 在对一个值使用不适当的类型时抛出。常见场景包括:尝试调用非函数类型的值,或者访问未定义的属性。

示例代码:

try {
  let num = 42;
  num(); // 试图将数字作为函数调用
} catch (error) {
  console.error(error.name);    // TypeError
  console.error(error.message); // num is not a function
}
用途:
  • 当一个值的类型不符合预期时,JavaScript 会抛出 TypeError
  • TypeError 对调试非常有用,帮助开发者定位类型相关的错误。
解决方法:
  • 在使用变量之前,检查其类型是否符合预期,避免类型不匹配。
  • 可以通过类型检测函数如 typeofinstanceof 来确保正确使用类型。

4. SyntaxError (语法错误)

SyntaxError 在代码解析过程中遇到语法错误时抛出。这类错误通常在代码的编译阶段发生,而不是在运行时。例如,括号未闭合或不正确的函数声明都会导致 SyntaxError

示例代码:
try {
  eval('function() {');  // 语法错误,括号未闭合
} catch (error) {
  console.error(error.name);    // SyntaxError
  console.error(error.message); // Unexpected token ')'
}
用途:
  • 检测并报告代码中的语法问题。
  • 这类错误通常在代码编写时由编辑器或编译器提前捕获。
解决方法:
  • 确保代码符合 JavaScript 的语法规则。
  • 使用开发工具或代码编辑器的语法检查功能来避免这类错误。

5. RangeError (范围错误)

RangeError 在数值超出允许范围时抛出。常见情况包括:递归调用次数超出栈大小,或给定的数值超出有效范围。

示例代码:
try {
  let arr = new Array(-1); // 数组长度为负数
} catch (error) {
  console.error(error.name);    // RangeError
  console.error(error.message); // Invalid array length
}
用途:
  • 当函数接收的数值超出其合法范围时,抛出 RangeError
  • 用于捕捉数组长度、函数参数等值超出预期范围的错误。
解决方法:
  • 检查传递给函数的参数或操作的数值是否在允许范围内。
  • 在递归函数中,限制递归深度,以避免栈溢出。

6. EvalError (eval 错误)

EvalError 主要与 eval() 函数相关。在早期的 ECMAScript 规范中,当 eval() 被误用时,会抛出 EvalError。不过,在现代 JavaScript 中,EvalError 很少使用,因为 eval() 的用法已被弱化。

示例代码:
try {
  throw new EvalError('eval 错误');
} catch (error) {
  console.error(error.name);    // EvalError
  console.error(error.message); // eval 错误
}
用途:
  • 用于捕获与 eval() 函数相关的错误,尽管现代 JavaScript 中几乎不再使用 EvalError
  • 尽量避免使用 eval() 函数,因为它可能引发安全问题并降低代码性能。
解决方法:
  • 避免使用 eval(),使用更安全、性能更好的替代方案,如 JSON.parse() 解析字符串。

7. URIError (URI 错误)

URIError 在全局 URI 处理函数(如 encodeURI()decodeURI()encodeURIComponent()decodeURIComponent())使用不合法的 URI 时抛出。传入不符合 URI 规则的字符串会导致此错误。

示例代码:
try {
  decodeURIComponent('%'); // URI 不合法
} catch (error) {
  console.error(error.name);    // URIError
  console.error(error.message); // URI malformed
}
用途:
  • 捕捉与 URI 编码解码相关的错误,确保传递的 URI 符合格式规范。
解决方法:
  • 在使用 URI 处理函数时,确保传递合法的 URI 格式字符串。
  • 预先检查输入数据,避免非法字符导致 URIError