JavaScript 基础教程

JavaScript 首页 JavaScript 路线图 JavaScript 概述 JavaScript 功能特性 JavaScript 启用 JavaScript 位置 JavaScript 语法 JavaScript Hello World JavaScript Console.log() JavaScript 注释 JavaScript 变量 JavaScript let 语句 JavaScript 常量 JavaScript 数据类型 JavaScript 类型转换 JavaScript 严格模式 JavaScript 保留关键字

JavaScript 运算符

JavaScript 运算符 JavaScript 算术运算符 JavaScript 比较运算符 JavaScript 逻辑运算符 JavaScript 位运算符 JavaScript 赋值运算符 JavaScript 条件运算符 JavaScript typeof 运算符 JavaScript 空值合并运算符 JavaScript 安全赋值运算符 JavaScript 删除运算符 JavaScript 逗号运算符 JavaScript 分组运算符 JavaScript Yield 运算符 JavaScript 展开运算符 JavaScript 幂运算符 JavaScript 运算符优先级

JavaScript 控制流

JavaScript If...Else JavaScript While 循环 JavaScript For 循环 JavaScript For...in JavaScript For...of JavaScript 循环控制 JavaScript Break 语句 JavaScript Continue 语句 JavaScript Switch Case JavaScript 用户定义迭代器

JavaScript 函数

JavaScript 函数 JavaScript 函数表达式 JavaScript 函数参数 JavaScript 默认参数 JavaScript Function() 构造函数 JavaScript 函数提升 JavaScript 自调用函数 JavaScript 箭头函数 JavaScript 函数调用 JavaScript 函数 call() 方法 JavaScript 函数 apply() 方法 JavaScript 函数 bind() 方法 JavaScript 闭包 JavaScript 变量作用域 JavaScript 全局变量 JavaScript 智能函数参数

JavaScript 对象

JavaScript Number JavaScript Boolean JavaScript Strings JavaScript Arrays JavaScript Date JavaScript DataView JavaScript Handler JavaScript Math JavaScript RegExp JavaScript Symbol JavaScript Sets JavaScript WeakSet JavaScript Maps JavaScript WeakMap JavaScript 可迭代对象 JavaScript Reflect JavaScript TypedArray JavaScript 模板字面量 JavaScript 带标签的模板

面向对象的 JavaScript

JavaScript 对象 JavaScript 类 JavaScript 对象属性 JavaScript 对象方法 JavaScript 静态方法 JavaScript 显示对象 JavaScript 对象访问器 JavaScript 对象构造函数 JavaScript 原生原型 JavaScript ES5 对象方法 JavaScript 封装 JavaScript 继承 JavaScript 抽象 JavaScript 多态 JavaScript 解构 JavaScript 解构赋值 JavaScript 对象解构 JavaScript 数组解构 JavaScript 嵌套解构 JavaScript 可选链式调用 JavaScript 全局对象 JavaScript Mixins (混合) JavaScript 代理

JavaScript 版本

JavaScript 历史 JavaScript 版本 JavaScript ES5 JavaScript ES6 ECMAScript 2016 ECMAScript 2017 ECMAScript 2018 ECMAScript 2019 ECMAScript 2020 ECMAScript 2021 ECMAScript 2022

JavaScript 异步

JavaScript 异步 JavaScript 回调函数 JavaScript Promises JavaScript Async/Await JavaScript Microtasks (微任务) JavaScript Promises JavaScript Promises 链 JavaScript 定时事件 JavaScript setTimeout() JavaScript setInterval()

JavaScript Cookies

JavaScript Cookies JavaScript Cookie 属性 JavaScript 删除 Cookies

JavaScript 浏览器 BOM

JavaScript 浏览器对象模型 JavaScript Window 对象 JavaScript Document 文档对象 JavaScript Screen 对象 JavaScript History 对象 JavaScript Navigator 对象 JavaScript Location 对象 JavaScript Console 对象

JavaScript Web APIs

JavaScript Web API JavaScript History API JavaScript Storage API JavaScript Forms API JavaScript Worker API JavaScript Fetch API JavaScript Geolocation API

JavaScript 事件

JavaScript 事件 JavaScript DOM 事件 JavaScript addEventListener() JavaScript 鼠标事件 JavaScript 键盘事件 JavaScript 表单事件 JavaScript 窗口/文档事件 JavaScript 事件委托 JavaScript 事件冒泡 JavaScript 事件捕获 JavaScript 自定义事件

JavaScript 错误处理

JavaScript 错误处理 JavaScript try...catch JavaScript 调试 JavaScript 自定义错误 JavaScript 扩展错误

JavaScript 重要关键字

JavaScript this 关键字 JavaScript void 关键字 JavaScript new 关键字 JavaScript var 关键字

JavaScript HTML DOM

JavaScript HTML DOM JavaScript DOM 方法 &属性 JavaScript DOM 文档 JavaScript DOM 元素 JavaScript DOM 属性 (Attr) JavaScript DOM 表单 JavaScript 修改 HTML JavaScript 修改 CSS JavaScript DOM 动画 JavaScript DOM 导航 JavaScript DOM 集合 JavaScript DOM NodeList JavaScript DOM DOMTokenList

JavaScript 高级章节

JavaScript 冒泡排序算法 JavaScript 循环引用错误 JavaScript 使用 Jest 进行代码测试 JavaScript CORS 处理 JavaScript 数据分析 JavaScript 死区 JavaScript 设计模式 JavaScript Engine 和 Runtime JavaScript 执行上下文 JavaScript 函数组合 JavaScript 不可变性 JavaScript Kaboom.js JavaScript 词法作用域 JavaScript 本地存储 JavaScript 记忆化 JavaScript 压缩 JS JavaScript 可变性 vs 不可变性 JavaScript 包管理器 JavaScript 解析 S 表达式 JavaScript 原型继承 JavaScript 响应式 JavaScript Require 函数 JavaScript Selection API JavaScript SessionStorage JavaScript SQL CRUD 操作 JavaScript 增强排序 JavaScript 临时死区 JavaScript 节流 JavaScript TRPC 库 JavaScript 真值和假值 JavaScript 上传文件 JavaScript 日期比较 JavaScript 递归 JavaScript 数据结构 JavaScript Base64 编码 JavaScript 回调函数 JavaScript 当前日期/时间 JavaScript 日期验证 JavaScript 过滤方法 JavaScript 生成颜色 JavaScript HTTP 请求 JavaScript 插入排序 JavaScript 延迟加载 JavaScript 链表 JavaScript 嵌套循环 JavaScript 空值检查 JavaScript 获取当前 URL JavaScript 图算法 JavaScript 高阶函数 JavaScript 空字符串检查 JavaScript 表单处理 JavaScript 函数式编程 JavaScript 形参 vs 实参 JavaScript 原型 JavaScript 响应式编程 JavaScript Reduce 方法 JavaScript Rest 运算符 JavaScript 短路 JavaScript 未定义检查 JavaScript 单元测试 JavaScript 验证 URL

JavaScript 杂项

JavaScript Ajax JavaScript 异步迭代 JavaScript Atomics 原子对象 JavaScript Rest 参数 JavaScript 页面重定向 JavaScript 对话框 JavaScript 页面打印 JavaScript 表单验证 JavaScript 动画 JavaScript 多媒体 JavaScript 图像映射 JavaScript 浏览器 JavaScript JSON JavaScript 多行字符串 JavaScript 日期格式 JavaScript 获取日期方法 JavaScript 设置日期方法 JavaScript 模块 JavaScript 动态导入 JavaScript BigInt JavaScript Blob JavaScript Unicode JavaScript 浅拷贝 JavaScript 调用堆栈 JavaScript 引用类型 JavaScript IndexedDB JavaScript 点击劫持攻击 JavaScript 柯里化 JavaScript 图形 JavaScript Canvas 画布 JavaScript 防抖 JavaScript 性能 JavaScript 代码风格指南

JavaScript 实用资源

JavaScript 面试题 JavaScript 速查表 JavaScript 函数


JavaScript - 错误与异常处理

JavaScript 中的错误处理是指检测和处理程序执行过程中发生的错误的过程。错误可以是语法错误、运行时错误或逻辑错误。程序执行过程中发生的错误称为运行时错误或异常。

在 JavaScript 中,错误可能由编程错误、用户输入错误等原因引起。错误会中断代码执行并导致糟糕的用户体验。构建健壮、可靠且用户友好的 JavaScript 应用程序需要有效的错误和异常处理。

什么是错误?

错误是程序执行过程中发生的事件,导致程序无法正常继续运行。错误可能由多种因素引起,例如语法错误、运行时错误和逻辑错误。

语法错误

语法错误,也称为解析错误,在传统编程语言中发生在编译时,而在 JavaScript 中发生在解释时。

例如,以下代码行由于缺少右括号而导致语法错误。

<script>
   window.print();
</script>

当 JavaScript 中出现语法错误时,只有与语法错误位于同一线程中的代码会受到影响,其他线程中的其余代码仍会执行,前提是这些线程中没有任何代码依赖于包含错误的代码。

运行时错误(异常)

运行时错误,也称为异常,发生在执行期间(编译/解释之后)。

例如,以下代码行会导致运行时错误,因为此处的语法正确,但在运行时,它尝试调用一个不存在的方法。

<script>
    window.printme();
</script>

异常也会影响发生异常的线程,从而使其他 JavaScript 线程能够继续正常执行。

JavaScript 运行时错误(异常)有很多,其中一些如下:

  • ReferenceError - 尝试访问未定义的变量/方法。

  • TypeError - 尝试对不兼容的数据类型进行操作。

  • RangeError - 值超出允许的范围。

逻辑错误

逻辑错误可能是最难追踪的错误类型。这些错误不是由语法或运行时错误引起的。相反,当您在驱动脚本的逻辑中犯了错误并且没有得到预期的结果时,就会发生这种情况。

例如,当您将任何数值除以 10 时,它会返回未定义的值。

<script>
   let num = 10/0;
</script>

什么是错误处理?

每当 JavaScript 代码中发生任何错误时,JavaScript 引擎都会停止整个代码的执行。如果您以正确的方式处理此类错误,则可以跳过出现错误的代码并继续执行其他 JavaScript 代码。

您可以使用以下机制来处理错误。

  • try...catch...finally 语句

  • throw 语句

  • onerror() 事件处理程序属性

  • 自定义错误

try...catch...finally 语句

最新版本的 JavaScript 添加了异常处理功能。 JavaScript 实现了 try...catch...finally 结构以及 throw 运算符来处理异常。

您可以捕获程序员生成的异常和运行时异常,但无法捕获 JavaScript 语法错误。

以下是 try...catch...finally 块语法 -

<script>
   try {
      // 要运行的代码
      [break;]
   } 
   catch ( e ) {
      // 发生异常时运行的代码
      [break;]
   }
   [ finally {
      // 无论是否发生异常,始终执行的代码
   }]
</script>

try 代码块后必须紧跟一个 catch 代码块或一个 finally 代码块(或两者之一)。当 try 代码块中发生异常时,异常会被放入 e 中,并执行 catch 代码块。可选的 finally 代码块会在 try/catch 之后无条件执行。

示例

以下示例尝试调用一个不存在的函数,而该函数又引发了异常。

让我们尝试使用 try...catch 捕获此异常并显示一条用户友好的消息。如果您想向用户隐藏此错误,也可以隐藏此消息。

您可以使用 finally 代码块,它始终会在 try/catch 之后无条件执行。

<html>
<head>
<script>               
   try {
      var a = 100;
      alert(myFunc(a));                  
   }
   catch (e) {
      alert(e);
   }
   finally {
      alert("Finally block will always execute!" );
   }
</script>
</head>
<body>
   <p>Exception handling using try...catch...finally statements</p>
</body>
</html>

输出

Exception handling using try...catch...finaly statements

throw 语句

您可以使用 throw 语句引发内置异常或自定义异常。之后,这些异常可以被捕获,并您可以采取适当的措施。

示例

以下示例演示了如何使用 throw 语句。

<html>
<head>
<script>
   function myFunc() {
      var a = 100;
      var b = 0;

      try {
         if ( b == 0 ) {
            throw( "Divide by zero error." ); 
         } else {
            var c = a / b;
         }
      }
      catch ( e ) {
         alert("Error: " + e );
      }
   }
</script>      
</head>
<body>
   <p>Click the following to see the result:</p>
   <form>
      <input type = "button" value = "Click Me" onclick = "myFunc();" />
   </form>
</body>
</html>

输出

Click the following to see the result:
Click Me

您可以使用字符串、整数、布尔值或对象在一个函数中引发异常,然后您可以在与上述相同的函数中捕获该异常,也可以在另一个函数中使用 try...catch 块捕获该异常。

onerror 事件处理程序属性

onerror 事件处理程序是 JavaScript 中第一个简化错误处理的功能。onerror 是"window"对象的事件处理程序属性,当网页的任何元素发生任何错误时,它都会自动触发。您可以在发生任何错误时调用回调函数来处理错误。

您可以按照以下语法使用 onerror 事件处理程序属性。

window.onerror = errorhandler_func;
或
<ele onerror="errorhandler_func()"> </ele>

在上述语法中,任何错误发生时都会执行 errorhandler_func()。

onerror 事件处理程序提供三条信息来识别错误的确切性质 -

  • 错误消息 - 与浏览器针对给定错误显示的消息相同

  • URL - 发生错误的文件

  • 行号 - 给定 URL 中导致错误的行号

示例

在下面的代码中,我们在 <input> 元素上添加了 onclick 事件,并在用户点击输入元素时调用 myFunc() 函数。myFunc() 函数尚未定义。因此,它会抛出一个错误。

我们使用了"onerror"事件处理程序来捕获错误。在回调函数中,我们打印了错误信息、文件 URL 以及发生错误的文件中的行号。

<html>
<body>
   <p> 点击以下按钮查看结果:</p>
   <form>
      <input type = "button" value = "Click Me" onclick = "myFunc();" />
   </form>
   <div id = "demo"> </div>
   <script>
      const output = document.getElementById("demo");
      window.onerror = function (msg, url, line) {
         output.innerHTML = "Error: " + msg + "<br>";
         output.innerHTML += "URL: " + url + "<br>";
         output.innerHTML += "Line: " + line + "<br>";
      }
   </script>
</body>
</html>

输出

点击以下按钮查看结果:
Click Me
Error: Uncaught ReferenceError: myFunc is not defined
URL: file:///C:/Users/Lenovo/Desktop/intex.html
Line: 5

您可以使用 onerror 方法(如下所示)在加载图像时出现任何问题时显示错误消息。

<img src="myimage.gif" onerror="alert('加载图像时发生错误。')" />

您可以将 onerror 与许多 HTML 标签结合使用,以便在发生错误时显示相应的消息。

JavaScript Error 类和 Error 对象

每当代码中发生任何错误时,JavaScript 都会抛出一个 error 类的实例(对象)。error 对象包含有关错误的信息。

然而,Error() 是适用于所有错误类型的通用构造函数,但不同类型的错误存在不同的对象。

JavaScript 自定义错误

您还可以使用 Error() 构造函数抛出带有自定义消息的错误。

const customError = new Error(message);
customError.name = "CustomError";

在这里,我们创建了"Error"类实例,并将"message"作为参数传递。此外,我们还更改了"name"属性的值。同样,如果您不想将"message"属性作为 Error() 构造函数参数传递,也可以更改其值。

JavaScript 错误对象参考

JavaScript 错误类型或构造函数

JavaScript 包含以下错误类型。您还可以将其用作构造函数来创建特定类型的新错误。

错误类型/对象 描述
Error 这是一个用于错误的泛型构造函数。您也可以通过扩展 Error 对象来创建自定义错误。
SyntaxError 当语法中出现任何错误时,都会抛出 SyntaxError 实例。例如,缺少括号、JSON 无效等。
ReferenceError 当您尝试访问当前作用域中未定义的变量时,会发生引用错误。
TypeError 当变量类型无效时,JavaScript 会抛出类型错误。
RangeError 当数字输入超出范围时,会抛出范围错误。
URIError 当您向 decoderURI 或 encodeURI 传递无效参数时,JavaScript 会抛出 URIError方法。
EvalError 已弃用。
AggregateError 它用于将多个错误对象聚合为一个错误对象,并允许您处理多个错误对象。

错误对象属性

Error 对象包含两个属性。

属性 描述
name 用于设置或获取错误名称。
message 用于设置或获取错误消息。

非标准属性和方法

以下是 Error 对象的非标准属性和方法列表。然而,并非所有浏览器都支持它们。因此,您应该避免使用它们。

属性 描述
columnNumber 仅支持 Firefox 浏览器。
description 仅支持 Microsoft 浏览器。
displayName 仅支持 Firefox 浏览器。
fileName 仅支持 Firefox 浏览器。
lineNumber 仅支持 Firefox 浏览器。
number 仅支持 Microsoft 浏览器。
stack 仅支持 Firefox 浏览器仅支持。
internalError() 仅 Firefox 浏览器支持。
toSource() 这是 Error 对象的非标准方法。