javascript异常处理实现原理详解

这篇文章主要介绍了javascript异常处理实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、什么是例外处理

当 JavaScript程序在运行中发生了诸如数组索引越界、类型不匹配或者语法错误时,JavaScript解释器就会引发例外处理。 ECMAScript定义了六种类型的错误,除此之外,我们可以使用Error对象和throw语句来创建并引发自定义的例外处理信息。

通过运用例外处理技术,我们可以实现用结构化的方式来响应错误事件的发生,让例外处理代码与正常脚本代码科学分离,最终使我们能够集中精力编写完成主要功能的核心程序。

二、使用 try…catch…finally 执行例外处理
在JavaScript中,我们使用try…catch…finally语句来执行例外处理,即通过它来捕捉错误发生后导致的例外或者执行throw语句产生的例外。

它的基本语法如下:

try {
  // 此处是可能产生例外的语句
} catch(error) {
  // 此处是负责例外处理的语句
} finally {
  // 此处是出口语句
}

上述代码中,try块中的语句首先被执行。如果运行中发生了错误,控制就会转移到位于catch块中语句,其中括号中的error参数被作为例外变量传递。否则,catch块的语句被跳过不执行。

无论是发生错误时catch块中的语句执行完毕,或者没有发生错误try块中的语句执行完毕,最后将执行 finally块中的语句。

下面我们来看一个例子:

try {
  document.writeln("开始执行try块语句 ---> ")
  document.writeln("还没有发生例外 ---> ")
  alert(eval(prompt("输入一个值:","")))
} catch(err) {
  document.writeln("捕捉到例外,开始执行catch块语句 --->");
  document.writeln("错误名称: " + err.name+" ---> ");
  document.writeln("错误信息: " + err.message+" ---> ");
} finally {
  document.writeln("开始执行finally块语句")
}

四、例外的表现形式:Error对象

在JavaScript,例外是作为Error对象出现的。

Error对象有两个属性:name属性表示例外的类型,message属性表示例外的含义。根据这些属性的取值,我们可以决定处理例外的方式,比如:

function evalText() {
 try {
  alert(eval(prompt("Enter JavaScript to evaluate:","")))
 } catch(err) {
  if(err.name == "SyntaxError")
    alert("Invalid expression")
  else
   alert("Cannot evaluate")
 }
}

上面的代码将对用户输入的内容进行表达式求值,然后显示出来。如果在求值过程中发生了SyntaxErroe类型错误,那么就会显示给用户“Invalid expression”的信息;否则,用户得到信息“Cannot evaluate”。

Error.name的取值一共有六种,如下:

  • EvalError:eval()的使用与定义不一致
  • RangeError:数值越界
  • ReferenceError:非法或不能识别的引用数值
  • SyntaxError:发生语法解析错误
  • TypeError:操作数类型错误
  • URIError:URI处理函数使用不当

五、定制例外信息

上述的六种Error类型基本上覆盖了脚本程序运行时所可能发生的错误。除了这些类型以外,我们还可以使用Error构造器来自定义例外类型。其语法如下:

myError = new Error(msg)

其中msg参数表示所定义的新例外的message属性值。同时,我们还可以创建新的对象类型以作为Error的子类型:

function MyError(msg) {
  this.name = "MyError"
  this.message = msg
}
MyError.prototype = new Error;

然后,我们就可以创建自定义错误子类的实例:

myError = new MyError("My error message")

六、触发例外

创建一个Error对象后,就可以使用throw语句来触发相应的例外。Throw的语法如下:

throw errObj

errObj必须是一个Error对象或者Error的子类型。在try块代码中触发一个例外后,控制将直接转入catch块。

下面的代码中,在try块中触发了一个例外,设置例外信息为“oops”,然后控制转移到catch块:

var s
try {
  s = "one "
  throw new Error("oops")
  s += "two"
} catch(err) {
  s += err.message
}
s += " three"
alert(s)

编写代码来触发例外的优点很多,比如有利于自定义错误类型,快速转入catch块执行,以及下面要介绍的在嵌套例外中将错误传递到外层。

七、嵌套例外处理

JavaScript支持多层次的嵌套例外处理。一般情况下,我们可以在内部例外处理的catch代码块中捕捉并处理错误,然后再次触发例外,这样就可进一步在外部例外处理的catch代码块中做更加深入的处理。下面来看看一个嵌套例外处理的例子:

var inner;
var outer;
try {
  document.writeln("Beginning outer try block, no exceptions yet");
  try{
   document.writeln("Beginning inner try block, no exceptions yet");
   // 生成一个引用错误
   document.writeln(undefinedVariable)
   document.writeln("Finished inner try block with no exceptions");
  } catch(inner) {
   // 内部例外处理
   document.writeln("Exception caught, beginning inner catch block");
   document.writeln("Error type: " + inner.name);
   document.writeln("Error message: " + inner.message);
   throw inner;
   document.writeln("No exceptions thrown in inner catch block");
  } finally {
   document.writeln("Executing inner finally block");
  }
  document.writeln("Finished outer try block with no exceptions");
} catch(outer) {
  // 外部例外处理
  document.writeln("Exception caught, beginning outer catch block");
  document.writeln("Error type: " + outer.name);
  document.writeln("Error message: " + outer.message);
} finally {
  document.writeln("Executing outer finally block");
}

执行后的输出结果如下:

Beginning outer try block, no exceptions yet
Beginning inner try block, no exceptions yet
Exception caught, beginning inner catch block
Error type: ReferenceError
Error message: undefinedVariable is not defined
Executing inner finally block
Exception caught, beginning outer catch block
Error type: ReferenceError
Error message: undefinedVariable is not defined
Executing outer finally block

嵌套例外处理的好处在于使我们能够很好地分阶段处理错误,内部例外处理可以负责解决由错误引发的脚本代码问题,外部例外处理则用于负责提供给用户的反馈信息或者对例外信息进行日志记录。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 简单学习5种处理Vue.js异常的方法

    错误大全 为了测试各种异常处理技巧,我故意触发三种类型的错误. 第一种:引用一个不能存在的变量: <div id="app" v-cloak> Hello, {{name}} </div> 上述代码运行后不会抛出错误,但是在控制台会有[Vue warn]消息. 111111111111111111 你可以在Codepen查看例子完整代码. 第二种:将变量绑定到一个被计算出来的属性,计算的时候会抛出异常. <div id="app" v-

  • 解析Node.js异常处理中domain模块的使用方法

    NodeJS 提供了 domain 模块,可以简化异步代码的异常处理.在介绍该模块之前,我们需要首先理解"域"的概念.简单的讲,一个域就是一个 JS 运行环境,在一个运行环境中,如果一个异常没有被捕获,将作为一个全局异常被抛出.NodeJS 通过 process 对象提供了捕获全局异常的方法,示例代码如下 process.on('uncaughtException', function (err) { console.log('Error: %s', err.message); });

  • javascript中异常处理案例(推荐)

    如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // cache 缓存 // try-catch-finall

  • 浅谈NodeJs之数据库异常处理

    本文介绍了NodeJs之数据库异常处理,分享给大家,具体如下: NodeJs版本:4.4.4 数据库链接错误 使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西.操作数据库是我们常用的功能.通过回调,我们这里会有很多err出没. 如下: var pool = require('../db.js'); var runtimeLog = require('../log.js').getLogger('runlog'); var Promise =

  • Nodejs异步回调之异常处理实例分析

    本文实例讲述了Nodejs异步回调之异常处理.分享给大家供大家参考,具体如下: 目前我们项目的Nodejs异常是通过express next 到 errorhandler 中间件去处理的, 原本以为此方法可以捕获到所有的异常,但事实发现并非如此. 下面以一个异常举例子: req.get('',function(req, res, next){ var a = undefined.b; // 产生了一个exception }) req.use(function(){req, res, next}{

  • Springboot2.0处理自定义异常并返回json

    这篇文章主要介绍了Springboot2.0处理自定义异常并返回json,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 编写自定义异常类 package cn.jfjb.crud.exception; /** * @author john * @date 2019/11/24 - 9:48 */ public class UserNotExistException extends RuntimeException { public Use

  • SpringBoot学习之全局异常处理设置(返回JSON)

    SpringBoot学习--全局异常处理设置(返回JSON) 需求 现在习惯使用ajax的方式发起请求,所以经常需要服务端返回一个json或者字符串. 控制全局的异常处理. 如果在单个方法中使用try,catch把方法包裹起来,工作量大,而且会异常的抛出而导致@Transactional注解的方法事务不会回滚. 说明 使用@ControllerAdvice注解 使用@ExceptionHandler注解 @ControllerAdvice 该注解是spring2.3以后新增的一个注解,主要是用来

  • jstorm源码解析之bolt异常处理方法

    问题 用过storm或者jstorm的都知道,如果在bolt代码中发生了没被catch住的异常,所在worker进程会退出.本文就从源码角度分析一下具体设计,其实并不是"有异常然后进程崩了"这么简单. 实质 我们先看BasicBoltExecutor的源码: public void execute(Tuple input) { _collector.setContext(input); try { _bolt.execute(input, _collector); _collector

  • Nodejs处理异常操作示例

    本文实例讲述了Nodejs处理异常操作.分享给大家供大家参考,具体如下: Exception.js module.exports = { expfun: function(flag) { if(flag == 0) { throw '我是error'; } return "success"; } } optfile.js //-------------optfile.js------------------------- var fs = require('fs'); module.e

  • javascript异常处理实现原理详解

    这篇文章主要介绍了javascript异常处理实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是例外处理 当 JavaScript程序在运行中发生了诸如数组索引越界.类型不匹配或者语法错误时,JavaScript解释器就会引发例外处理. ECMAScript定义了六种类型的错误,除此之外,我们可以使用Error对象和throw语句来创建并引发自定义的例外处理信息. 通过运用例外处理技术,我们可以实现用结构化的方式来响应错误事

  • JavaScript原型继承和原型链原理详解

    这篇文章主要介绍了JavaScript原型继承和原型链原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在讨论原型继承之前,先回顾一下关于创建自定义类型的方式,这里推荐将构造函数和原型模式组合使用,通过构造函数来定义实例自己的属性,再通过原型来定义公共的方法和属性. 这样一来,每个实例都有自己的实例属性副本,又能共享同一个方法,这样的好处就是可以极大的节省内存空间.同时还可以向构造函数传递参数,十分的方便. 这里还要再讲一下两种特色的构造

  • JavaScript对象原型链原理详解

    这篇文章主要介绍了JavaScript对象原型链原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一个js对象,除了自己设置的属性外,还会自动生成proto.class.extensible属性,其中,proto属性指向对象的原型. 对象的属性也有writable.enumerable.configurable.value和get/set的配置方法. 对象的创建方式有三种: 一.使用字面量直接创建. 二.基于原型链创建. 分析上图,要点如

  • JavaScript开发简单易懂的Svelte实现原理详解

    目录 Demo1 create_fragment SvelteComponent 可以改变状态的Demo Svelte问世很久了,一直想写一篇好懂的原理分析文章,拖了这么久终于写了. Demo1 首先来看编译时,考虑如下App组件代码: <h1>{count}</h1> <script> let count = 0; </script> 这段代码经由编译器编译后产生如下代码,包括三部分: create_fragment方法 count的声明语句 class

  • Javascript对象及Proxy工作原理详解

    正文 这一章其实算是javascript的科普文章,其实这本书的读者一般都不会是入门者,因此按道理说应该不需要再科普才对.但是作者依旧安排了这一章,证明就是这一章内容与我们以为的对象不一样. Javascript中一切皆对象 这一句话大家应该耳熟能详,对于常规的字面量对象,和new出来的对象,大家应该都能分辨 const str = '' const str2 = new String() const obj = {} const obj2 = Object.create() 但是根据ECMA,

  • JavaScript面试Module Federation实现原理详解

    目录 基本概念 1.什么是 Module Federation? 2.Module Federation核心概念 3.使用案例 4.插件配置 工作原理 1.使用MF后在构建上有什么不同? 2.如何加载远程模块? 3.如何共享依赖? 应用场景 1.代码共享 2.公共依赖 总结 基本概念 1.什么是 Module Federation? 首先看一下官方给出的解释: Multiple separate builds should form a single application. These sep

  • JavaScript装饰器的实现原理详解

    目录 装饰器的常见作用 装饰类的属性 装饰类 注意 实例应用 最近在使用TS+Vue的开发模式,发现项目中大量使用了装饰器,看得我手足无措,今天特意研究一下实现原理,方便自己理解这块知识点. 装饰器的常见作用 装饰一个类的属性 装饰一个类 装饰器只能针对类和类的属性,不能直接作用于函数,因为存在函数提升. 下面我们针对这两种情况进行举例阐述. 装饰类的属性 function readonly(target, name, descriptor) { discriptor.writable = fa

  • Python JSON编解码方式原理详解

    这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: 使用json函数 使用 JSON 函数需要导入 json 库:import json.函数含义: 源码解析: # coding= utf-8 #

  • Web网络安全分析XSS漏洞原理详解

    目录 XSS基础 XSS漏洞介绍 XSS漏洞原理 反射型XSS 存储型XSS DOM型XSS XSS基础 XSS漏洞介绍 跨站脚本(Cross-Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会收到影响.恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作).私密网页内容.会话和cookie等各种内容. XSS攻击可以分为三种:反射型.存储型和DOM

  • 计算机网络编程MQTT协议基础原理详解

    目录 什么是 MQTT 协议 MQTT 基础 发布 - 订阅模式 可拓展性 消息过滤 基于主题的过滤 基于内容的过滤 基于类型的过滤 MQTT 与消息队列的区别 MQTT 重要概念 MQTT client MQTT broker MQTT Connection 消息报文 CONNECT CONNACK 消息类型 发布 订阅 确认消息 退订 确认退订 聊聊 Topic 通配符 单级通配符 多级通配符 之前有位读者给我留言说想要了解一下什么是 MQTT 协议,顺便还把我夸了一把,有点不好意思啦. 那

随机推荐