(day 24)JavaScript学习笔记(异常的处理)

news2024/11/26 8:49:47

概述 

        这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。

        今天学习异常的处理,主要是捕获异常、throw关键字主动抛异常、Error对象、以及捕获多个异常 。

1.异常介绍

        在JavaScript中,异常是指在程序执行期间遇到的错误或非正常情况。这些异常可能源于浏览器、环境或程序本身,并且会中断正常的程序流程。异常处理是编程中不可或缺的一部分,它允许程序在遇到错误时采取适当的措施,而不是简单地崩溃。

        例如我们访问一个没有定义的变量,系统会抛异常。如下代码所示:

console.log(a);

        抛异常如下截图: Uncaught ReferenceError: a is not defined

         在JavaScript中出现异常后,后面的代码便不会再执行。

        如下代码所示: 

console.log(a);

console.log("这里不会执行");

        运行结果与上面一样:

        JavaScript中的异常有多种类型,以下是一些常见的异常类型及其示例:

        语法错误:这是指程序在语法上存在错误,无法被正确解析和执行。例如,关键字拼写错误、缺少括号、缺少分号等。例如,var number = 10 if (number > 5) { console.log("Number is greater than 5.") } 这段代码中,缺少了分号,导致程序无法正确解析。
        运行时错误:这是指程序在执行期间遇到了无法处理的错误或异常情况。例如,变量类型不正确、访问未定义的变量、数组越界等。
        类型错误(TypeError):当变量或表达式不是预期类型时,会抛出TypeError。例如,尝试对一个非函数类型的值调用函数,或者尝试访问一个null或undefined值的属性时,都会抛出TypeError。
        除了上述常见的异常类型外,JavaScript还支持其他错误类型,如ReferenceError(引用错误,当尝试访问一个未声明的变量时抛出)、RangeError(范围错误,当数值超出其能表示的范围时抛出)等。 

2.捕获异常

        在JavaScript中,捕获异常是处理运行时错误的重要机制,它允许程序在遇到错误时采取适当的措施,而不是中断执行。异常捕获主要通过try-catch-finally语句实现。 

         try块:这个块包含可能会抛出异常的代码。当执行try块中的代码时,如果发生异常,JavaScript引擎会立即停止当前代码的执行,并查找与之匹配的catch块来处理异常。
        catch块:这个块紧跟在try块之后,并包含用于处理异常的代码。当try块中的代码抛出异常时,控制权会立即转移到catch块。在catch块中,你可以访问一个特殊的变量(通常是e或error),它包含了异常的信息,如错误的类型、描述和堆栈跟踪。你可以使用这个变量来记录错误、显示错误消息或采取其他适当的措施。
        finally块:这个块是可选的,它会在try和catch块执行完毕后执行,无论是否抛出异常。finally块通常用于执行一些清理工作,如关闭文件、释放资源或重置状态。

        如下代码示意:

try {
  var stu = undefined;
  console.log(stu.name);
} catch (err) {
  console.log(err);
  console.log("错误已捕获");
} finally {
  console.log("这行总会执行");
}

console.log("这行会执行");

         运行的结果如下截图:

 3.throw

        在JavaScript中,throw是一个关键字,用于主动抛出一个异常。当程序在执行过程中遇到无法处理的错误或异常情况时,可以使用throw来中断正常的执行流程,并将控制权交给异常处理机制。

        throw后面通常跟的是一个错误对象,这个对象可以是JavaScript内置的错误类型(如Error、TypeError、ReferenceError等),也可以是自定义的错误类型。当throw语句被执行时,它会立即生成一个异常对象,并停止当前函数的执行,然后将控制权传递给最近的异常处理语句(通常是catch块)。

        如下代码示意:

function divide(a, b) {
  if (b === 0) {
    throw "除数不能为0";
  }
  return a / b;
}

try {
  console.log(divide(10, 0));
} catch (error) {
  if (error === "除数不能为0") {
    console.error("除数不能为0");
  }
}

         代码运行结果如下:

4.Error对象

        Error对象是JavaScript的原生对象,用于表示程序在运行过程中遇到的错误或异常情况。当程序解析和运行过程中发生了错误,JS引擎会自动产生并抛出一个Error对象的实例,并且程序会终止在错误发生的地方。

        Error对象包含了一些重要的属性,其中最常用的两个是name和message。name属性指明了异常的类型,例如“EvalError”、“RangeError”、“ReferenceError”、“SyntaxError”、“TypeError”或“URIError”等。而message属性则提供了关于异常的详细信息,即人类可读的错误描述。

        如下代码所示,我们把前面的代码改一下,把错误信息给到error对象,

function divide(a, b) {
  if (b === 0) {
    throw new Error("除数不能为0");
  }
  return a / b;
}

try {
  console.log(divide(10, 0));
} catch (error) {
  console.error("捕获到异常:", error.message);
  console.error(error.name);
}

        运行结果如下:

 

5.捕获多个异常

        在JavaScript中,如果我们想捕获多个不同类型的异常,需要使用多个catch块来分别处理它们。每个catch块会捕获并处理一种或一类特定的异常。这允许我们针对不同类型的异常执行不同的处理逻辑。

        下面是一个示例,展示了如何使用多个catch块来捕获并处理不同类型的异常:

function divide(a, b) {
  if (b === 0) {
    throw new TypeError("除数不能为0");
  }
  if (typeof a !== "number" || typeof b !== "number") {
    throw new TypeError("参数必须是数字");
  }
  return a / b;
}

try {
  const result = divide("hello", 0);
} catch (error) {
  if (error instanceof TypeError) {
    console.error("捕获到TypeError:", error.message);
    // 在这里处理TypeError类型的异常
  } else if (error instanceof RangeError) {
    console.error("捕获到RangeError:", error.message);
    // 在这里处理RangeError类型的异常
  } else {
    console.error("捕获到未知错误:", error);
    // 在这里处理其他类型的异常
  }
}

        在上面的代码中,我们定义了一个divide函数,它可能会抛出两种类型的TypeError。在try块中,我们调用divide函数并传入了一个字符串和0作为参数,这会导致抛出异常。

        在catch块中,我们首先检查捕获到的错误是否是TypeError的实例。如果是,我们就执行相应的处理逻辑。然后,我们可以添加更多的else if分支来处理其他类型的异常,如RangeError。最后,如果捕获到的错误不是已知的类型,我们可以执行一个通用的错误处理逻辑。

        使用多个catch块来处理异常提供了更细粒度的控制,允许我们针对不同类型的异常执行不同的操作。然而,请注意,这种做法可能会使代码变得相对复杂。因此,在设计异常处理策略时,需要根据实际需求来权衡是否使用多个catch块。

        以上便是今天的学习内容,如果对你有所帮助请点个赞再走吧。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1557316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++中的STL(未完成)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

SQLServer sys.default_constraints介绍

sys.default_constraints 是 SQL Server 的系统视图,它包含了数据库中所有默认约束的信息。默认约束是数据库对象(如表中的列)的约束,它为列定义了一个默认值,当在插入新行时没有为该列提供值时,将使用这个…

HarmonyOS实战开发-如何实现一个支持加减乘除混合运算的计算器。

介绍 本篇Codelab基于基础组件、容器组件,实现一个支持加减乘除混合运算的计算器。 说明: 由于数字都是双精度浮点数,在计算机中是二进制存储数据的,因此小数和非安全整数(超过整数的安全范围[-Math.pow(2, 53)&#…

【一】DDR3基础知识与IMG IP

【一】DDR3基础知识与IMG IP 一、DDR3的基本知识 1、DDR3全称为第三代双倍速率同步动态随机存储器 特点:掉电无法保存数据,需要周期性的刷新;时钟上升沿和下降沿都在传输数据;突发传输,突发长度burtst length一般为…

AcWing 1413. 矩形牛棚(每日一题)

原题链接:1413. 矩形牛棚 - AcWing题库 作为一个资本家,农夫约翰希望通过购买更多的奶牛来扩大他的牛奶业务。 因此,他需要找地方建立一个新的牛棚。 约翰购买了一大块土地,这个土地可以看作是一个 R 行(编号 1∼R&…

45.跳跃游戏||

// 定义一个名为Solution的类 class Solution {// 定义一个public方法jump,输入参数为一个整数数组nums,返回值类型为整数public int jump(int[] nums) {// 初始化跳跃次数结果变量为0int result 0;// 初始化当前覆盖的最远距离下标为0int end 0;// 初…

RVM安装ruby笔记

环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…

某东推荐的十大3C热榜第一名!2024随身wifi靠谱品牌推荐!2024随身wifi怎么选?

一、鼠标金榜:戴尔 商务办公有线鼠标 售价:19.9¥ 50万人好评 二、平板电脑金榜:Apple iPod 10.2英寸 售价:2939¥ 200万人好评 三、随身WiFi金榜:格行随身WiFi 售价:69¥ 15万人好评 四、游戏本金榜&#xff…

python爬虫-----输入输出与流程控制语句(第四天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

车辆充电桩管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 1. 前台功能…

Linux系统使用Docker部署MinIO结合内网穿透实现公网访问本地存储服务

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…

车载电子与软件架构

车载电子与软件架构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四…

网安学习笔记-day10,web服务器

web服务器的部署 Web(World Wide Web)(“万维网”) 我们一般用的网页都由web服务器提供的 使用的协议是基于TCP协议的HTTTP(80)和HTTPS(443) 常用Web服务器发布软件 微软:IIS(Internet Information Services) Linux:Apache/LAMP/Tomcat 第三方&#…

36.HarmonyOS鸿蒙系统 App(ArkUI) 创建第一个应用程序hello world

36.HarmonyOS App(ArkUI) 创建第一个应用程序helloworld 线性布局 1.鸿蒙应用程序开发app_hap开发环境搭建 3.DevEco Studio安装鸿蒙手机app本地模拟器 打开DevEco Studio,点击文件-》新建 双击打开index.ets 复制如下代码: import FaultLogger from ohos.fau…

【OpenGL】使用 python + Qt + OpenGL 的现代渲染

伴随资源 目录 一、说明二、 关于PyQt6.x2.1 QOpenGLWidget详细说明2.2 绘画技巧 三、PyOpenGL四、OpenGL 管线五、Python集成开发环境5.1 Emacs配置5.2 pycharm环境 六、你好,OpenGL!七、QGL控件八、平截头体.svg九、定义几何9.1 立即模式与保留模式9…

如何系统的自学python?

系统地自学Python是一个循序渐进的过程,以下是一份详细的指南,帮助你从零开始逐步掌握这门语言: 1、了解Python及其应用场景: 阅读关于Python的简介,理解它为何流行,以及在哪些领域(如Web开发…

【二叉树】Leetcode 108. 将有序数组转换为二叉搜索树【简单】

将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。 示例1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null…

Linux 系统快速安装PHP环境(新手版)

Linux 系统快速安装PHP环境(新手版) 1、下载安装包,这里安装php-7.4.22.tar.gz。PHP安装包下载。 2、上传到local并解压 cd php-7.4.22 3、安装必备依赖 (如果yum源需要更新可以运行 yum -y update) yum -y install…

鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

随后迎来了不少互联网公司与华为鸿蒙原生应用达成了合作,像我们常见的阿里、京东、小红书、得物……等公司,还有一些银行也都与华为鸿蒙达成了合作。使得一时之间市场紧缺鸿蒙开发人才,不少公司不惜重金争抢人才。 据智联招聘的最新数据显示…

sadtalker学习用于风格化音频驱动单图像说话人脸动画的真实 3D 运动系数的应用

论文出处 https://arxiv.org/abs/2211.12194 使用方法 1. 打开项目的colab链接 https://colab.research.google.com/github/Winfredy/SadTalker/blob/main/quick_demo.ipynb#scrollTofAjwGmKKYl_I 在examples/source_image文件夹中添加希望动起来说话的图片,这…