Javascript程序异常处理

news2024/12/23 15:18:22

什么是异常,异常就是我们在编写Javascript程序时出现的一些错误,并会在控制台中抛出这个错误,出现异常其实并不是一件坏事,相对的呢它可以提醒我们开发人员哪里出现了错误,方便我们后续的修改,能让我们的代码更加的流畅丝滑的运行,如果你对程序异常还不了解,看完该篇会让你对异常有一个初步的了解,也能在出现异常时做出相应的处理。

目录

1.异常的分类

 2.异常的执行流程

 3.捕获异常

 4.手动抛出异常

 5.总结


1.异常的分类

在Javascript中,异常通常表现为一个对象,不同的对象表达了不同的异常类型,不同类型的异常对应着不同的错误。

异常类型含义
SyntaxError  语法错误
ReferenceError引用错误,使用了不存在的变量或函数
TypeError

类型错误,往往是使用了一个对象中不存在的成员 

RangeError范围错误,通常在操作超出有效范围时发生,如数组访问超出边界
URIErrorURI错误,通常发生在encodeURI()或者decodeURI()等方法时给出无效的URI时发生
EvalErroreval错误,通常在eval()函数中执行代码时发生错误
InternalError内部错误,通常发生在Javascript引擎内部发生错误导致

举几个常见的错误类型的例子

1.语法错误

 const user = [name: 'zs', age: 18]

我上面的这段代码是一个很明显的语法错误,错把数组当成了对象来存储数据,这时候控制台就会报语法错误的提示

 2.引用错误

 function get() {
      console.log(111);
    }
 set()

我这段代码定义了一个get()函数,但是我们调用的是set()方法,看控制台的报错信息

 3.类型错误

let arr = { name: '111' }
arr.push(222)

 我这里定义了一个对象,但是后续调用了push()方法,这个方法只有数组才有的,所以此时就会报这个类型错误

 其实呢,所有的错误都是以对象形式存在的,比如我们也可以自定义一个错误,并将其打印出来

    let err = new TypeError('arr.push is not a function')
    console.error(err);

控制台也会输出相应的错误

 2.异常的执行流程

当代码在执行过程中遇到了错误,会发生什么事情?

1.自动创建对应的异常对象,抛出错误

2.程序终止运行,我们知道js代码是从上到下依次运行的,如果前面出现错误,后面的代码也就不会执行了

3.控制台会显示异常对象,异常对象中包含了二个信息:程序异常的类型和原因,以及会描述出程序异常出现的位置

看下面这个例子

   function A() {
      console.log('start A');
      B()
      console.log('end A');
    }
    function B() {
      console.log('start B');
      C()
      console.log('end B');
    }
    function C() {
      console.log('start C');
      let a;
      console.log(a.name); //这里会出现错误
    }
    A()
    console.log('程序执行完毕');

初步分析我们可以知道 a.name这是一个典型的类型错误,a并不像一个对象

控制台信息:

 可以很清楚的看到代码并没有执行完就终止了,因为中途遇到了错误导致的

报错信息也很详细的告诉了我们程序出错的原因,以及它出现的位置,并且这个报错信息会将有关的成员全部牵扯进来,最终的错误原因是因为在C()函数中的第52行,间接原因是B()中调用了C(),A()中调用了B(),总路线中出现的错误在54行,很清楚的描述了错误信息。

 3.捕获异常

捕获异常说白了就是去捕获在代码运行时可能会发生错误的代码,然后对其做出一些处理,让我们的代码能够完全执行完,不至于报错后就停止运行了。

利用try catch捕获异常 

看下面的代码

try {
      console.log("try 开始");
      console.log(a.name); //这里会出现错误,进行捕获
      console.log("try 结束");
    } catch (err) {
      console.log("catch 开始");
      console.log(err.message); //错误提示
      console.log("catch 结束");
    } finally { //无论是否发生错误都会执行
      console.log("整个程序结束");
    }

这是运行结果

 从结果我们就能看出来try catch的执行流程了,首先运行try中的代码,只要发生了错误就是捕获错误,运行catch中的代码,并能从err.message中捕获到错误信息,并且整个代码都可以执行完毕,并不是出现停止运行的情况。

 其实在绝大多数情况下我们是不需要捕获异常的,毕竟写好的代码怎么可能无缘无故报错呢,一般都是跟一些业务场景结合才会使用捕获异常

首先是我们提前就能预知某段代码会出现异常,比如网络请求,出现错误的情况,用户在断网的情况下

然后就是我们必须要确定出现异常后该做些什么事情,就比如用户断网了,我们捕获错误后应该提醒用户

 4.手动抛出异常

它的语法是这样的,错误的类型我们可以随便定义

    throw new TypeError('这是一个类型错误')

这是控制台的报错

 什么时候会用到手动抛出错误

1.可以预知某段代码可能会发生错误

2.浏览器不会自动抛出该错误

3.该函数无法处理这个错误

下面是一个例子:

 //这是一个求和的函数
    function sum(a, b) {
      if (typeof a !== 'number' || typeof b !== 'number') {
        throw new TypeError('传入的参数必须是数字')
      }
      return a + b
    }
    let s = sum(1, '2')

这是一个求和的函数,并且我们规定传入的参数必须是整数,但是执行此函数浏览器并不会报错,这时候我们就可以手动的抛出这个错误来提醒开发者

 5.总结

1.对于异常的知识,大概要知道基本的错误类型有哪些,这样在写代码,调试代码时能更快的找出程序的错误

2.要能够根据错误信息迅速的反应过来是什么错误,并能找到错误的代码行

3.要知道捕获异常的语法以及捕获异常的时机

4.会在适当的时机手动抛出错误

希望此文对你了解异常的知识能有所帮助

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

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

相关文章

JRebel+XRebel热部署插件激活支持IDEA2023.1

JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效。IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,修改才能生效;所以推荐使用 JRebel 插件进行热部署。 在填入Team UR…

字符串类QString

字符串类QString 构造函数数据操作字符串查找和判断遍历查看字节数类型转换字符串格式 Qt中不仅支持C, C中的字符串类型, 而且还在框架中定义了专属的字符串类型。 Cchar*Cstd::string, char*QtQByteArray, QString QByteArray QString和QByteArray的函数很多都是相似的。。…

Feign远程调用如何携带form url

这是一个需要携带参数在form url上的请求,正常调用方式是这样的 响应: 在Feign中,应该怎么调用呢?? 定义OpenFeignClient接口 FeignClient(value "client-service", url "http://127.0.0.1/api") public interface…

Acwing.897 最长公共子序列(动态规划)

题目 给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。 输入格式 第一行包含两个整数N和M。 第二行包含一个长度为N的字符串,表示字符串A。 第三行包含一个长度为M的字符串,表示字符串B。字符串…

RunnerGo相比较JMeter有哪些优势

当谈到性能测试需求时,JMeter和RunnerGo都提供了丰富的功能,包括测试场景设置、执行性能测试和性能测试结果分析。然而,这两工具在结构方面存在一些区别。以下是对它们进行比较的另一种角度: 模块化设计: JMeter采用…

16K个大语言模型的进化树;81个在线可玩的AI游戏;AI提示工程的终极指南;音频Transformers课程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 LLM 进化树升级版!清晰展示 15821 个大语言模型的关系 这张进化图来自于论文 「On the Origin of LLMs: An Evolutionary …

基于压缩和差分算法的嵌入式平台远程更新设计与分析

传统的嵌入式远程更新方案普遍采用整包更新方式,这种方式更新数据量大,占用网络带宽时间长,同时也增加了设备的功耗。 针对这些问题,提出了以减少更新数据量为核心的两种远程更新方案。这两种方案分别使用LZ77压缩和BSDiff差分算…

【Linux】passwd

passwd 与 root 不同的是,一般帐号在更改密码时需要先输入自己的旧密码 (亦即 current 那一行),然后再输入新密码 (New 那一行)。 要注意的是,密码的规范是非常严格的,尤其新的 dist…

《互联网引流:如何吸引更多用户并实现商业目标?》

互联网引流是当今数字时代中,企业和个人在互联网上推广自己产品、服务或内容的一种重要手段。随着互联网的普及和发展,越来越多的企业意识到了利用互联网引流来吸引潜在用户的重要性。 互联网引流的目标是通过各种策略和手段,将潜在用户转化…

Android 在程序运行时申请权限——以自动拨打电话为例

Android 6.0及以上系统在使用危险权限时必须进行运行时权限处理。 main_activity.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://sche…

WordPress集成Argon主题[CentOS7]

下载 Argon主题 https://gitcode.net/mirrors/solstice23/argon-theme/-/releases/v1.3.5?spm1033.2243.3001.5876配置并安装Argon主题 mkdir -p /home/wwwroot/default/wordpress/wp-content/uploads/ cd /home/wwwroot/default/wordpress/wp-content/uploads/# 上传并解压…

echarts自定义tooltip,给tooltip增加百分号%

1.formatter为回调函数&#xff1a; 支持返回 HTML 字符串或者创建的 DOM 实例。 (params: Object|Array, ticket: string, callback: (ticket: string, html: string)) > string | HTMLElement | HTMLElement[] 在 trigger 为 ‘axis’ 的时候&#xff0c;或者 tooltip 被…

LiveGBS流媒体平台GB/T28181常见问题-token有效期是多久如何设置token有效期有效时间接口调用token的有效时长

LiveGBS常见问题如何设置TOKEN有效时间接口调用token的有效时长 1、TOKEN有效期2、默认token有效期3、配置token_key4、如何配置一直有效的token5、动态有效期6、搭建GB28181视频直播平台 1、TOKEN有效期 调用登陆接口后&#xff0c;会获得一个token&#xff0c;默认的有效期是…

PCB封装设计指导(十四)保存并产生device文件

PCB封装设计指导(十四)保存并产生PSM和device文件 封装命名完成之后,基本上封装的建立也接近结束,如果调网表使用的是第三方网表,还需要device文件才能调入。 但是PSM文件是不管第一方和第三方网表都是需要的,下面介绍如何产生这两个文件。 打开封装文件,如下图点击Fil…

深入理解 Linux 文件系统:从根目录到用户主目录

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

存储过程——用户自定义变量、局部变量

1.用户自定义变量 在会话一定义的变量在会话二中是用不了的。 使用set指令定义变量,并为变量赋值&#xff0c;mysql中赋值推荐使用 :&#xff0c;因为在mysql中没有这个比较运算&#xff0c;也带有比较运算的功能&#xff0c;因此赋值运算推荐使用 : set myname itcast; se…

一条sql搞崩了整个业务 ai问答

事件起因&#xff0c;我的小伙伴群里有个人发了这么一个消息 我去分析了一下原因&#xff08;&#xff09;&#xff0c;有不同观点评论区评论 使用连接且连接条件都唯一 不使用连接且where条件都唯一

【java】【面对对象高级1】static

目录 1、static修饰成员变量 1.1 修饰成员变量 1.2 成员变量的执行原理 2、static修饰成员变量的应用场景 3、static修饰成员方法 3.1 修饰成员方法 3.2 成员方法的执行原理 4、static修饰成员方法的应用场景 4.1 MyUtil工具类 4.2 main 5、static的注意事项 5.1 类方法…

Vue中TodoList案例_编辑

nextTick: MyItem.vue 加一个编辑按钮&#xff0c;input框&#xff1a;blur失去焦点时触发事件handleBlur&#xff0c;ref获取真实dom&#xff1a; <inputtype"text"v-show"todo.isEdit":value"todo.title"blur"handleBlur(todo,$even…

Access violation at address. Read of address FFFFFFC

常规的数据操作&#xff1a; 见上图&#xff0c;数据保存在.ClientDataSet1数据集中&#xff0c;为了将参数逐条保存在Txt文件中&#xff0c;做了对ClientDataSet&#xff08;DBGridEh&#xff09;的循环写盘和读盘操作&#xff1a; 但是&#xff0c;原代码通过数据集循环 &…