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 相关文章推荐
js限制textarea每行输入字符串长度的代码
Oct 31 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
Aug 26 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
Jun 08 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
Jun 15 Javascript
easyui tree带checkbox实现单选的简单实例
Nov 07 Javascript
JavaScript获取当前时间向前推三个月的方法示例
Feb 04 Javascript
慕课网题目之js实现抽奖系统功能
Sep 19 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
Dec 20 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
Vue formData实现图片上传
Aug 20 Javascript
如何使用gpu.js改善JavaScript的性能
Dec 01 Javascript
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
模仿OSO的论坛(二)
2006/10/09 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
python字典排序实例详解
2015/05/20 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
python requests.post带head和body的实例
2019/01/02 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
python元组拆包实现方法
2021/02/28 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
护士自我鉴定范文
2013/10/06 职场文书
软件项目开发计划书
2014/05/01 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
学校联谊协议书
2014/09/16 职场文书
英文道歉信
2015/01/20 职场文书
鲁迅故里导游词
2015/02/05 职场文书
教师年度个人总结
2015/02/11 职场文书
刑事附带民事诉讼答辩状
2015/05/22 职场文书
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL
Python正则表达式中flags参数的实例详解
2022/04/01 Python