javascript异常处理实现原理详解


Posted in Javascript onFebruary 17, 2020

这篇文章主要介绍了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

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

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

Javascript 相关文章推荐
javascript遍历控件实例详细解析
Jan 10 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
Feb 10 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
JavaScript 中对象的深拷贝
Dec 04 Javascript
hovertree插件实现二级树形菜单(简单实用)
Dec 28 Javascript
js 倒计时(高效率服务器时间同步)
Sep 12 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
Apr 26 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 Javascript
vue 封装 Adminlte3组件的实现
Mar 18 Javascript
浅谈JS的二进制家族
May 09 Javascript
Vue+webpack实现懒加载过程解析
Feb 17 #Javascript
javascript History对象原理解析
Feb 17 #Javascript
Vue中fragment.js使用方法小结
Feb 17 #Javascript
javascript实现倒计时效果
Feb 17 #Javascript
JavaScript将数组转换为链表的方法
Feb 16 #Javascript
javascript canvas API内容整理
Feb 16 #Javascript
vue props 单项数据流实例分享
Feb 16 #Javascript
You might like
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
一些PHP写的小东西
2006/12/06 PHP
PHP 多维数组排序实现代码
2009/08/05 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
JavaScript编程设计模式之构造器模式实例分析
2017/10/25 Javascript
Vue 组件封装 并使用 NPM 发布的教程
2018/09/30 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
[33:17]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python3.x提取中文的正则表达式示例代码
2019/07/23 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
学校介绍信范文
2014/01/14 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
2014年林业工作总结
2014/12/05 职场文书
社区好人好事材料
2014/12/26 职场文书
实习单位意见
2015/06/04 职场文书
Spring依赖注入多种类型数据的示例代码
2022/03/31 Java/Android
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle