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 相关文章推荐
jquery下json数组的操作实现代码
Aug 09 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 Javascript
jQuery中$.each使用详解
Jan 29 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
详解Vue2 无限级分类(添加,删除,修改)
Mar 07 Javascript
js Dom实现换肤效果
Oct 21 Javascript
Vue开发实现吸顶效果的示例代码
Aug 21 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
vue-i18n结合Element-ui的配置方法
May 20 Javascript
微信小程序拼接图片链接无底洞深入探究
Sep 03 Javascript
vue项目在线上服务器访问失败原因分析
Aug 14 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在线生成ico文件的代码
2007/10/09 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
PHP观察者模式原理与简单实现方法示例
2017/08/25 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
Python中shutil模块的学习笔记教程
2017/04/04 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
Python切片索引用法示例
2018/05/15 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python装饰器代替set get方法实例
2019/12/19 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
python 模拟登陆163邮箱
2020/12/15 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
企业内控岗位的职责
2014/02/07 职场文书
目标责任书范本
2014/04/16 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
甲午大海战观后感
2015/06/02 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
python如何读取和存储dict()与.json格式文件
2022/06/25 Python