7个你应该知道的JS原生错误类型

概述

从浏览器控制台到运行 Node.js的终端,我们到处都会看到错误。本文的重点是概述我们在js开发过程中可能遇到的错误类型。

提示:良好的错误提示会导致快速而无痛的发展经历与缓慢而痛苦的发展经历之间的区别。在编写可重用的代码时,请确保自己在编写清晰易懂的错误处理代码。

1. RangeError

当数字超出允许的值范围时,将会抛出此错误。

例如

const l = console.logconst arr = [90,88]
arr.length=90**99

我们有一个数组,带有两个元素的 arr。接下来,尝试将数组扩展为包含90**99 == 2.9512665430652753e+193个元素。

这个数字超出了数组大小可以增长的范围。运行它会抛出 RangeError:

$ node errors

errors.js:4

arr.length=90**99

 ^RangeError: Invalid array length

因为我们要增加 arr 数组的大小超出了 JS 指定的范围。

2. ReferenceError

当对变量或项目的引用被破坏时,将会引发此错误。那是变量或项目不存在。

例如

const l=console.logconst cat = "cat"
cat
dog

有一个变量cat被初始化为 “cat”。接下来引用了cat变量和dog变量。cat变量存在,而dog变量不存在。

cat将返回 “cat”,而dog将引发引用错误,因为在环境记录中找不到名称dog。

$ node errors

errors.js:3

dog

^ReferenceError: dog is not defined

每当我们创建或定义变量时,变量名称都会写入环境记录中。环境记录就像键值存储一样,

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+

每当我们引用变量时,它都会存储程序中定义的变量。当在记录中找到环境值并提取并返回值时,将以该变量的名称作为关键字在环境记录进行搜索。调用尚未定义的函数。

现在,当我们创建或定义一个没有赋值的变量时。变量将其键作为变量名写入环境记录,但其值将会保持未定义的状态。

var catenv record

+-----------------+

| Key | Value |

-------------------

| cat | undefined |

+-----------------+

稍后为变量分配值时,将在环境记录中搜索该变量,当发现它未定义值时,该赋值将被覆盖。

var cat

cat = "cat"env record

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+

所以当在环境记录中找不到变量名时,JS 引擎将引发 RefernceError。

+-------------+

| Key | Value |

---------------

| cat | "cat" |

+-------------+cat // "cat", yes, :) it's there

dog // :( what's this? can't find it

注意:未定义的变量不会抛出 ReferenceError,因为它在于环境记录中的值尚未设置。

3. SyntaxError

这是最常见的错误。当我们输入 JS 引擎不能理解的代码时,就会发生这个错误。

JS 引擎在解析期间捕获了这个错误。在 JS 引擎中,我们的代码经历了不同的阶段,然后才能在终端上看到结果。

  • 标记化
  • 解析
  • 解释

标记化将代码的源分解为各个单元。在此阶段,将对数字、关键字、文字、运算符进行分类并分别标记。

接下来,生成的标记流将会传递到解析阶段,由解析器处理。这是从标记流生成 AST 的地方。 AST 是代码结构的抽象表示。

在标记化和解析这两个阶段,如果我们代码的语法不符合 JS 的语法规则,则会使该阶段失败并引发 SyntaxError。例如:

const l = console.loglet cat h = "cat"

代码中的 “h” 代表什么?这个 “h” 破坏了代码。

$ node errors

errors.js:3

let cat h = "cat"

 ^SyntaxError: Unexpected identifier

看,Node.js 指出了问题的所在。它说 “h” 是意外的,它破坏了cat 变量的声明。

因此,可以说语法错误在解析或编译期间发生。

4. TypeError

当其他 NativeError 对象中没有适当的失败原因的指示时,TypeError 用于指示操作失败。

对错误的数据类型执行操作时会发生 TypeError,例如:

如果我们尝试将数字转换为大写,如下所示:

const num = 123
num.toUpperCase()

这将引发TypeError

$ node errors

errors.js:4

num.toUpperCase()

 ^TypeError: num.toUpperCase is not a function

因为toUpperCase函数需要字符串数据类型。toUpperCase函数是有意通用的;它不需要其this值是String对象。因此,可以将其转移到其他种类的对象中用作方法。

只有字符串才会转换为大写或小写形式,如果我们在 Objects、Boolean、Symbol、null、undefined 数据类型上调用toUpperCase函数,则将会得到 TypeError,因为它操作的数据类型错误。

5. URIError

这表明使用了一种与其定义不兼容的全局 URI 处理函数。

JS 中的 URI(统一资源指示符)具有以下功能:decodeURI、decodeURIComponent 等。

如果我们用错误的参数去调用其中任何一个,将得会到一个 URIError。

decodeURI("%")
^URIError: URI malformed

encodeURI用于获取 URI 的未编码版本。 “%” 不是正确的 URI,因此引发了URIError。

当 URI 编码或解码出现问题时,会引发 URIError。

6. EvalError

当使用全局eval()函数时,这用于识别错误。

根据 EcmaSpec 2018 版:

此规范当前未使用此异常。保留它目的是为了与本规范的先前版本兼容。

7. InternalError

该错误在 JS 引擎内部发生,特别是当它有太多数据要处理并且栈增长超过其关键限制的时侯。

当 JS 引擎被过多的递归和切换情况等淹没时,就会发生这种问题

switch(num) {
 case 1:
 ...
 break
 case 2:
 ...
 break
 case 3:
 ...
 break
 case 4:
 ...
 break
 case 5:
 ...
 break
 case 6:
 ...
 break
 case 7:
 ...
 break
 ... up to 1000 cases
 }

以下是一个简单的过多递归的例子:

function foo() {
    foo()
}
foo()

总结

正如我们所说,谁都会犯错误。就我们敲代码这件事而言,这是一个稳定的事件。为了克服它,我们需要知道可以抛出的原生错误的类型。本文中列出了它们,并提供了一些示例来说明它们是如何引发的。

所以无论什么时候在终端或浏览器中引发错误,你都可以轻松发现错误产生的位置和方式,并能够编写更好、更不易出错的代码。

以上就是7个你应该知道的JS原生错误类型的详细内容,更多关于JS原生错误类型的资料请关注我们其它相关文章!

(0)

相关推荐

  • Node.js下自定义错误类型详解

    前言 一般来说,很少人会考虑如何处理应用产生的错误的策略,调试的过程中,简单地利用console.log('error')定位错误,基本够用了,通过留下这些调试信息,能够为我们以后的调试过程中升了不少时间,提高了维护性.所以错误提示非常重要.同时,也会带来一些比较糟糕用法.最近的项目里就用到了自定义错误类型,觉得有必要深入了解一下,所以就写了这篇文章,方便自己和有需要的大家在需要的时候查阅. Subclassing Error 首先我们可以定义一个 Error 的子类.通过 Object.cre

  • 详解javascript中的Error对象

    概念 error是指程序中的非正常运行状态,在其他编程语言中称为"异常"或"错误",解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息: ECMAScript定义了六种类型的错误,除此之外,还可以使用Error构造方法创建自定义的Error对象,并使用throw语句抛出该对象: 六种错误: 1)ReferenceError:引用错误,要用的东西没找到:       2)TypeError:类型错误,错误的调用了对象的方法:       3)R

  • 详解JavaScript中的六种错误类型

    刚入前端坑,英语又不太好的同学,是不是还在为控制台的错误抓耳挠腮?今天就带大家看一看JavaScript中常见的错误类型. js中的控制台的报错信息主要分为两大类,第一类是语法错误,这一类错误在预解析的过程中如果遇到,就会导致整个js文件都无法执行.另一类错误统称为异常,这一类的错误会导致在错误出现的那一行之后的代码无法执行,但在那一行之前的代码不会受到影响. 1. SyntaxError:语法错误 // 1. Syntax Error: 语法错误 // 1.1 变量名不符合规范 var 1 /

  • JavaScript通过使用onerror设置默认图像显示代替alt

    JavaScript代码 //图像加载出错时的处理 function errorImg(img) { img.src = "默认图片.jpg"; img.onerror = null; } html代码 <img width="32" height="32" src="1.jpg" onerror="errorImg(this)" /> 为了美观当网页图片不存在时不显示叉叉图片 当在页面显示的时

  • JS常见错误(Error)及处理方案详解

    1. 错误的类型 Error: 所有错误的父类型 错误的子类型包括: ReferenceError: 引用的变量不存在 TypeError: 数据类型不正确的错误 RangeError: 数据值不在其所允许的范围内 SyntaxError: 语法错误 常见的内置错误: (1)ReferenceError: 引用变量不存在 console.log(a) //ReferenceError: a is not defined (2)TypeError: 数据类型不正确 var b = {} b.xxx

  • IE8 下的Js错误HTML Parsing Error...

    网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; QQDownload 551; SLCC2; .NET CLR 2.0.50727)时间戳: Wed, 12 Aug 2009 07:02:03 UTC 消息: HTML Parsing Error: Unable to modify the parent container element before the child

  • javascript Error 对象 错误处理

    Error对象 Property:   name: 错误名   number: 错误号   description: 描述   message: 错误信息,多同description  FF Only 属性   fileName: 错误发生的文件   stack: 错误发生时的调用堆栈 Constructor:   Error(){     this(0,"")} Error(description){     this(0,description)} Error(number,des

  • JS使用onerror捕获异常示例

    本文实例讲述了JS使用onerror捕获异常的方法.分享给大家供大家参考,具体如下: 如果需要利用 onerror 事件,就必须创建一个处理错误的函数.你可以把这个函数叫作 onerror 事件处理器 (onerror event handler).这个事件处理器使用三个参数来调用:msg(错误消息).url(发生错误的页面的 url).line(发生错误的代码行). <head> <script type="text/javascript"> onerror=

  • javascript window.onerror事件学习新收获

    在捕获js错误时,我们通常使用try{}catch(e){}的方式,然后通过e.errorMessage等方式获取错误信息然后报告错误.但对于onerror事件可能很少问津,我们是否思考过如何报告错误所在的行号?如果想过这个是否也被这个问题所困扰过,是否认为在js里不可能捕获错误的行号呢?其实本人就遇到上述的几个问题,今日读某人写的一段js代码顿然发现了onerror事件,要说onerror这个时间也是n久以前就知道了,但对于其所带有的三个参数和其特殊性质却一直没有去了解过.经过自己的研究测试,

  • 总结Node.js中的一些错误类型

    前言 Node.js应用中可能会发生多种类型的错误.如:当出现语法错误或运行时错误时,会触发JavaScript错误:当试图试访问一个不存在或没有访问的文件时,会触发系统错误:除JavaScript错误和系统错误错误外,用户还可以自定义错误. 1. 错误分类 Node.js是一个JavaScript运行时平台,其应用发生错误都是一个Error实例或Error子类的实例. 在Node.js应用中,可能发生的错误有以下4类: 1.标准JavaScript错误,如: <EvalError> : 当调

随机推荐