用生命谱写代码的赞歌

0%

JS 错误类型解析

SyntaxError

SyntaxError 是解析代码时发生的语法错误

syntax [‘sintæks] 语法;句法;有秩序的排列

1
2
3
4
// 变量名错误
var 1a;
// 缺少括号
console.log 'hello');

ReferenceError

ReferenceError 是引用一个不存在的变量时发生的错误。

reference [‘refərəns] 参考,参照;涉及,提及;参考书目;介绍信;证明书

  1. 变量未定义
1
2
console.log(unknow);
// ReferenceError: unknow is not defined
  1. 另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果或者 this 赋值。
1
2
3
4
console.log() = 1
// ReferenceError: Invalid left-hand side in assignment
this = 1
// ReferenceError: Invalid left-hand side in assignment

RangeError

RangeError 是当一个值超出有效范围时发生的错误。主要有几种情况,一是数组长度为负数,二是 Number 对象的方法参数超出范围,以及函数堆栈超过最大值。

range [reindʒ] 范围;幅度

  1. 数组长度为负数
1
var a= new Array(-1);
  1. 数字超出范围
1
(1234).toExponential(21)

toExponential() 方法可把对象的值转换成指数计数法。

返回值

NumberObject.toExponential(num)

返回 NumberObject 的字符串表示,采用指数计数法,即小数点之前有一位数字,小数点之后有 num 位数字。该数字的小数部分将被舍入,必要时用 0 补足,以便它达到指定的长度。

抛出

当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。

当调用该方法的对象不是 Number 时抛出 TypeError 异常。

TypeError

TypeError 是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、数值等原始类型的值使用 new 命令,就会抛出这种错误,因为 new 命令的参数应该是一个构造函数。

1
2
3
('a').toExponential(19)
new 123
var obj = {}; obj.unknownMethod()

URLError(URL错误)

与url相关函数参数不正确,主要是 encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape() 这六个函数。

1
2
document.write("http://www.w3school.com.cn/My first/");
document.write(encodeURI("http://www.w3school.com.cn/My first/"));

EvalError

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

以上这6种派生错误,连同原始的Error对象,都是构造函数。开发者可以使用它们,人为生成错误对象的实例。

1
2
3
new Error("出错了!");
new RangeError("出错了,变量超出有效范围!");
new TypeError("出错了,变量类型无效!");

上面代码表示新建错误对象的实例,实质就是手动抛出错误。可以看到,错误对象的构造函数接受一个参数,代表错误提示信息(message)。