JavaScript错误处理完整指南( 二 )

(3)ReferenceError 
ReferenceError 表示引用错误 。当代码中的变量引用有问题时,会发生 ReferenceError 。可能忘记在使用变量之前为其定义一个值,或者可能试图在代码中使用一个不可访问的变量 。在任何情况下,通过堆栈跟踪都可以提供充足的信息来查找和修复有问题的变量引用 。
ReferenceErrors 发生的一些常见原因如下:
 

  • 在变量名中输入错误 。
  • 试图访问其作用域之外的块作用域变量 。
  • 在加载之前从外部库引用全局变量 。
 
JavaScript错误处理完整指南

文章插图
 
(4)RangeError
RangeError 表示范围错误 。当变量设置的值超出其合法值范围时,将抛出 RangeError 。它通常发生在将值作为参数传递给函数时,并且给定值不在函数参数的范围内 。当使用记录不完整的第三方库时,有时修复起来会很棘手,因为需要知道参数的可能值范围才能传递正确的值 。
RangeError 发生的一些常见场景如下:
 
  • 试图通过 Array 构造函数创建非法长度的数组 。
  • 将错误的值传递给数字方法,例如 toExponential()、toPrecision()、toFixed()等 。
  • 将非法值传递给字符串函数,例如 normalize() 。
 
JavaScript错误处理完整指南

文章插图
 
(5)URIError
URIError 表示 URI错误 。当 URI 的编码和解码出现问题时,会抛出 URIError 。JavaScript 中的 URI 操作函数包括:decodeURI、decodeURIComponent 等 。如果使用了错误的参数(无效字符),就会抛出 URIError 。
JavaScript错误处理完整指南

文章插图
 
(6)EvalError
EvalError 表示 Eval 错误 。当 eval() 函数调用发生错误时,会抛出 EvalError 。不过,当前的 JavaScript 引擎或 ECMAScript 规范不再抛出此错误 。但是,为了向后兼容,它仍然是存在的 。
【JavaScript错误处理完整指南】如果使用的是旧版本的 JavaScript,可能会遇到此错误 。在任何情况下,最好调查在eval()函数调用中执行的代码是否有任何异常 。
(7)InternalError
InternalError 表示内部错误 。在 JavaScript 运行时引擎发生异常时使用 。它表示代码可能存在问题也可能不存在问题 。
InternalError 通常只发生在两种情况下:
 
  • 当 JavaScript 运行时的补丁或更新带有引发异常的错误时(这种情况很少发生);
  • 当代码包含对于 JavaScript 引擎而言太大的实体时(例如,数组初始值设定项太大、递归太多) 。
 
解决此错误最合适的方法就是通过错误消息确定原因,并在可能的情况下重构应用逻辑,以消除 JavaScript 引擎上工作负载的突然激增 。
注意:现代 JavaScript 中不会抛出 EvalError 和 InternalError 。
(8)创建自定义错误类型
虽然 JavaScript 提供了足够的错误类型类列表来涵盖大多数情况,但如果这些错误类型不能满足要求,还可以创建新的错误类型 。这种灵活性的基础在于 JavaScript 允许使用 throw 命令抛出任何内容 。
可以通过扩展 Error 类以创建自定义错误类:
class Validationerror extends Error {constructor(message) {super(message);this.name = "ValidationError";
可以通过以下方式使用它:
throw ValidationError("未找到该属性: name")
可以使用 instanceof 关键字识别它:
try {validateForm() // 抛出 ValidationError 的代码} catch (e) {if (e instanceof ValidationError) {else {3. 抛出错误
很多人认为错误和异常是一回事 。实际上,Error 对象只有在被抛出时才会成为异常 。
在 JavaScript 中抛出异常,可以使用 throw 来抛出 Error 对象:
throw TypeError("Expected number");
或者:
throw new TypeError("Expected number");
来看一个简单的例子:
function toUppercase(string) {if (typeof string !== "string") {throw TypeError("Expected string");return string.toUpperCase();


推荐阅读