JavaScript错误处理


Posted in Javascript onFebruary 03, 2015

一.错误分类

1. 语法错误

也称为解析错误,发生在传统编程语言的编译时,在JavaScript中发生在解释时,这些错误是由代码中的意外字符直接引起的,然后就不能直接编译/解释,eg,在一行代码因缺少右括号,产生了语法错误。发生语法错误时,就不能继续执行代码。在JavaScript中,只有在同一个线程中的代码会受语法错误的影响。在其他线程中的代码和其他外部引用的文件中的代码,如果不依赖于包含错误的代码,则可以继续执行。

2. 运行时错误

也称为异常(exception,在编译期/解释器后)。此时,问题并不出在代码的语法上,而是,尝试完成的一个操作,在某些情况下是非法的。eg.

window.openMyFile();

因不存在openMyFile()方法,浏览器会返回一个异常。异常只影响发生的线程,其他JavaScript线程即可继续正常的执行。

二.处理错误

1.       onerror事件处理函数

它是第一个用来协助JavaScript处理错误的机制。页面上出现异常时,error事件便在window对象上触发。Eg.

                        <html>

    <head>

           <title>onerror例子</title>

           <script type="text/javascript">

                  window.onerror = function() {

       alert("发生错误!");

}

           </script>

       </head>

       <body onload="fuction1()">

       </body>

</html>

 在上述代码中,在页面载入时尝试调用不存在的函数,此时会引发一个异常。弹出“发生错误”的错误信息。但是,浏览器的错误信息也显示出来了,如何在浏览器上隐藏它呢,只需onerror方法返回一个true即可。

<script type="text/javascript">

     window.onerror = function() {

     alert(“发生错误!”);

     return true;

}

</script>

1) 取出错误信息

onerror处理函数提供了三种信息来确定错误确切的性质:

 i)错误信息——对于给定错误,浏览器会显示同样的信息;

 ii)URL——在哪个文件中发生了错误;

行号——给定URL中发生错误的行号。

访问方法见如下例子:

<script type="text/javascript">

           window.onerror = function(sMessage, sUrl, sLine) {

alert("发生错误!\n" + sMessage + "\nURL:" + sUrl + "\nLine Number:" + sLine);

return true;

}

</script>

2) 图像载入错误

window对象并非唯一支持onerror事件处理函数的对象,它对图像对象也提供支持。当一个图像由于文件不存在等原因未能成功载入时,error事件便在这个图像上触发。让我们来看一个例子:

<img src=”amigo.jpg” onerror=”alert(‘载入图片时发生错误')”/>

上例直接在HTML中分配onerror事件处理函数。当然也可以通过脚本来分配事件处理函数,在设置图像的src特性前,必须等待页面完全载入,代码如下:

<html>

    <head>

           <title>Image错误测试</title>

        <script type="text/javascript">

                  function handleLoad() {

       document.images[0].onerror = function() {

       alert("载入图片时发生错误!");

};

document.images[0].src = "amigo.jpg";

}

              </script>

       </head>

       <body onload="handleLoad()">

              <img/>

       <body>

</html>

注意:与window对象的onerror事件处理函数不同,image的onerror事件任何的额外信息的参数。

3) 处理语法错误

onerror还能处理语法错误。但有一点必须注意,事件处理函数必须是页面中第一个出现的代码,因为如果语法错误出现在设置事件处理函数之前出现,事件处理函数就没有用了。

注意:语法错误会完全停止代码的执行。

说明:使用onerror事件处理函数的主要的问题是,它是BOM的一部分,所以,没有任何标准能控制它的行为。因此,不同的浏览器使用这个事件处理错误的方式有明显的不同,eg,在IE中发生error事件时,正常的代码会继续执行,所有的变量和数据都保留下来,并可通过onerror事件处理函数访问。在Mozilla中,正常的代码执行都会结束,同时所有的错误发生之前的变量和数据都被销毁。

2.       try…catch语句

ECMPScript第三版,引入了try…catch语句。Eg.

try {

        window.openFile1();

        alert("成功调用openFile1方法");

} catch (exception) {

        alert("发生异常!");

} finally {

        alert("try..catch测试结束!");

}

 与Java不同,ECMAScript标准在try…catch语句中只能有一个catch语句,因为JavaScript是弱类型的语言,没办法指明catch子句中异常的特定类型。不管错误是什么类型,都由同一个catch语句处理。但Mozilla对其进行了扩展,可加多个catch语句,不推荐这样使用。

 finally用于包含无论是否有异常发生都要执行的代码,这对关闭打开的链接和释放资源很有用。

1) 嵌套try…catch语句

用来处理catch子句中的错误问题,让我们来看一个例子,代码如下:

try {

    eval("a ++ b");

} catch(oException) {

    alert("发生错误!");

    try {

      var aError = new Array(1000000000000000000000000000000000000000);

} catch(exception) {

      alert("在catch子句中发生错误!");

}

} finally{

       alert("已完成")

}

2) Error对象

发生错误时,JavaScript有个Error基类用于抛出。它有两个特性:

  i)name——表示错误类型的字符串

  ii)message——实际的错误信息。

Error对象的name对应于它的类,可以是如下值之一:

EvalError:错误发生在eval()函数中;

RangeError:数字值超出JavaScript可表示的范围;

ReferenceError:使用了非法的引用;

SyntaxError:在eval()函数调用中发生了语法错误,其他的愈发错误由浏览器报告,无法通过try…catch处理;

TypeError:变量的类型不是预期所需的;

URIError:在encodeURI或decodeURI函数发生了错误。

3) 判断错误类型

可采取如下两种方法来判断错误类型,第一种根据异常的name属性判断,如下:

try {

        eval("a ++ b");

} catch(oException) {

        if (oException.name = "SyntaxError") {

       alert("发生SyntaxError!");

} else {

       alert("发生其他错误!");

}

}

 第二中采用instanceof操作符,代码如下:

try {

        eval("a ++ b");

} catch(oException) {

       if (oException instanceof SyntaxError) {

       alert("发生SyntaxError!");

} else {

       alert("发生其他错误!");

}

}

4) 抛出异常的throw语句

在ECMAScript第三版引入,用于有目的的抛出异常,抛出的错误对象可为字符串、数字、布尔值或实际的对象,也可以抛出Error对象(其构造函数只有一个函数,即错误信息)。eg1. throw new Error(“错误产生!”);

eg2.

function addTwoNumber(a, b) {

       if (arguments.length < 2) {

       throw new Error("需要传入两个数字!");

}

}

try {

       result = addTwoNumber(90);

} catch(oException) {

       if (oException instanceof SyntaxError) {

       alert("SyntaxError:" + oException.message);

} else if (oException instanceof Error){

       alert(oException.message);

}

}

以上就是本文所述的全部内容了,希望小伙伴们能够喜欢。

Javascript 相关文章推荐
JQuery 文本框使用小结
May 22 Javascript
使用jquery局部刷新(jquery.load)从数据库取出数据
Jan 22 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析
May 24 Javascript
jQuery简单入门示例之用户校验demo示例
Jul 09 Javascript
js style.display=block显示布局错乱问题的解决方法
Sep 21 Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
简单实现jQuery弹幕效果
May 06 jQuery
使用cropper.js裁剪头像的实例代码
Sep 29 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 Javascript
js实现右下角提示框的方法
Feb 03 #Javascript
Node.js中child_process实现多进程
Feb 03 #Javascript
jquery实现增加删除行的方法
Feb 03 #Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
Feb 03 #Javascript
director.js实现前端路由使用实例
Feb 03 #Javascript
js与jquery回车提交的方法
Feb 03 #Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
Feb 03 #Javascript
You might like
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP利用APC模块实现大文件上传进度条的方法
2015/10/29 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
python操作MySQL数据库具体方法
2013/10/28 Python
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
Python实现端口检测的方法
2018/07/24 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
最小二乘法及其python实现详解
2020/02/24 Python
python文件排序的方法总结
2020/09/13 Python
CSS3 毛玻璃效果
2019/08/14 HTML / CSS
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
旷课检讨书
2015/01/26 职场文书
房贷工资证明范本
2015/06/12 职场文书
干部考核工作总结2015
2015/07/24 职场文书
《绝招》教学反思
2016/02/20 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
一文搞懂Java中的注解和反射
2022/06/21 Java/Android