zoukankan      html  css  js  c++  java
  • 7个你应该知道的 JavaScript 原生错误类型

    从浏览器控制台到运行 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 版:

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

    佛山vi设计https://www.houdianzi.com/fsvi/ 豌豆资源搜索大全https://55wd.com

    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()

    总结

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

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

  • 相关阅读:
    [BTS2004]一步一步学习BizTalk2004 CBR(contentbased routing)
    [BTS06]BizTalk2006 SDK阅读笔记(六) 定义流程
    [JS]收藏
    [BTS06]BizTalk2006 SDK阅读笔记(七) 管理与监控
    [C#]关于调用Office应用程序后,程序不退出的问题
    [JS]让表单提交返回后保持在原来提交的位置上
    [BTS][收藏]啥时候用BTS,啥时候用WF,就看这里。
    [BTS06]BizTalk2006 SDK阅读笔记(一) 角色
    [BTS]BizTalk学习之Functoid篇(Database Lookup)
    [LCS]半个月的成果,用RTCClient开发的Robot!
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/13847517.html
Copyright © 2011-2022 走看看