Javascript 错误处理的几种方法


Posted in Javascript onJune 13, 2009

1.使用window.onerror指定错误处理函数。
当有错误的时候,onerror会被callback。 当某个JavaScript block中有多个script错误时,第一个错误触发后(回调callback),当前Javascript block后面的script会被自动Drop忽略掉,不被执行。
如: 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Test</title> 
<script type="text/javascript"> 
window.onerror = function(message, url, line) 
{ 
alert("Error.\nMessage:"+ message +"\nUrl:" + url + "\nLine:" + line) 
return true; 
} 
</script> 
</head> 
<body> 
<script type="text/javascript"> 
test(); 
test(); 
test(); 
test(); 
</script> 
<script type="text/javascript"> 
test(); 
test(); 
test(); 
test(); 
</script> 
</body> 
</html>

在上面的例子中只会有每一个block中的第一个test();产生error。触发window.onerror回调,后面的Javascript会被忽略掉。img 也支持 onerror < img src="pic.gif" onerror = "javascript:alert("An error occurred.");"/>。onerror 是浏览器支持的对象。由浏览器决定是否可以使用,不是DOM标准。

2.使用Javascript中的try catch throw处理异常。
Javascript支持了try catch throw,Javascript中定义的异常:
(1)EvalError: An error occurs in the eval() function.
(2)RangeError: A number value is greater then or less then the number that can be represented in Javascript(Number.MAX_VALUE and Number.MIN_VAKUE).
(3)ReferenceError: An illegal reference is used.
(4)SyntaxError: A syntax error occus inside of an eval() function call. All other syntax error are reorted by the browser and cannot be handled with a try...catch statement.
(5)TypeError. A variables type is unexpected. 6.URIError. An error ocuurs in the encodeURI() or the decodeURI() function.
如:

<script type="text/javascript"> 
function CreateError() 
{ 
throw new Error("Created error by custom."); 
} 
try 
{ 
//throw a error from a function just want to see the call stack in firefox. 
CreateError(); 
} 
catch(error) 
{ 
var errorMsg = ("Message: " + error.message + "\n"); 
if(typeof(error.stack)!=undefined) 
{ 
//FF 
errorMsg += ("Line Number: " + error.lineNumber + "\n"); 
errorMsg += ("File Name: " + error.fileName + "\n"); 
errorMsg += ("Stack Trace:\n" + error.stack + "\n"); 
} 
else 
{ 
//IE 
errorMsg += ("Description: " + error.description + "\n"); 
errorMsg += ("Number: " + error.number + "\n"); 
} 
alert(errorMsg); 
} 
finally 
{ 
//alert("End try catch.message from finally block."); 
} 
</script>

Error.message是IE和FireFox都支持的属性。
IE支持description 和 number属性。
FF支持fileName lineNumber 和 stack 属性。
由于Javascript是弱类型的语言。
所以在catch部分只能catch一次,不能像C#这样的语言可以写多个catch,catch不同类型的exception。
但是可以用 instanceof ErrorType的方式实现类似的功能。
如:

<script type="text/javascript"> 
try 
{ //Syntax Error 
//eval("alert a"); //Custom Error 
throw new Error("An error occured."); 
} 
catch(error) 
{ 
if(error instanceof SyntaxError) 
{ 
alert("Syntax Error"); 
} 
else if(error instanceof EvalError) 
{ 
alert("Eval Error"); 
} 
else if(error instanceof RangeError) 
{ 
alert("Range Error"); 
} 
else if(error instanceof ReferenceError) 
{ 
alert("Reference Error"); 
} 
else if(error instanceof TypeError) 
{ 
alert("Type Error"); 
} 
else if(error instanceof Error) 
{ 
alert("Custon Error"); 
} 
alert(error.message); 
} 
</script>

注:浏览器不会抛出Error类型的exception异常,所以如果捕获到Error类型的异常,可以确定这个异常是用户代码抛出的,不是浏览器抛出的。
Javascript的assert()

function assert(bCondition, sErrorMsg) { 
 if (!bCondition) { 

 
 alert(sErrorMsg); 

 
 throw new Error(sErrorMsg); 

 } 
}
Javascript 相关文章推荐
JavaScript中关于indexOf的使用方法与问题小结
Aug 05 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
Sep 13 Javascript
解析John Resig Simple JavaScript Inheritance代码
Dec 03 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
JQuery节点元素属性操作方法
Jun 11 Javascript
解析Vue2.0双向绑定实现原理
Feb 23 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
Angular 开发学习之Angular CLI的安装使用
Dec 31 Javascript
Angular CLI在Angular项目中如何使用scss详解
Apr 10 Javascript
JavaScript错误处理操作实例详解
Jan 04 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
Javascript 学习书 推荐
Jun 13 #Javascript
javascript 框架小结 个人工作经验
Jun 13 #Javascript
动态刷新 dorado树的js代码
Jun 12 #Javascript
firefo xml 读写实现js代码
Jun 11 #Javascript
犀利的js 函数集合
Jun 11 #Javascript
js 操作css实现代码
Jun 11 #Javascript
图片连续滚动代码[兼容IE/firefox]
Jun 11 #Javascript
You might like
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php 中英文语言转换类代码
2011/08/11 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
Javascript----文件操作
2007/01/18 Javascript
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
Bootstrap实现模态框效果
2019/09/30 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
用Python实现筛选文件脚本的方法
2018/10/27 Python
Python可迭代对象操作示例
2019/05/07 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
怎么处理XML的中文问题
2015/03/26 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
成语的广告词
2014/03/19 职场文书
政治表现评语
2014/05/04 职场文书
销售岗位职责范本
2014/06/12 职场文书
环保志愿者活动方案
2014/08/14 职场文书
男方婚前保证书
2015/02/28 职场文书
个人廉洁自律总结
2015/03/06 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS