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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
Feb 23 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
Sep 23 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
JS中去掉array中重复元素的方法
May 26 Javascript
vuex提交state&&实时监听state数据的改变方法
Sep 16 Javascript
JavaScript基于数组实现的栈与队列操作示例
Dec 22 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
简谈创建React Component的几种方式
Jun 15 Javascript
小程序简单两栏瀑布流效果的实现
Dec 18 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
两个强悍的php 图像处理类1
2009/06/15 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
微信小程序自定义组件
2017/08/16 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Django数据库表反向生成实例解析
2018/02/06 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
本科毕业生自荐信
2014/06/02 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
法定授权委托证明书
2014/09/27 职场文书
个性发展自我评价2015
2015/03/09 职场文书
李强为自己工作观后感
2015/06/11 职场文书
信用卡收入证明范本
2015/06/12 职场文书
教学副校长工作总结
2015/08/13 职场文书
七年级英语教学反思
2016/02/15 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书