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关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
基于jquery编写分页插件
Mar 07 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
Oct 11 Javascript
JSON与XML的区别对比及案例应用
Nov 11 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 Javascript
vue - vue.config.js中devServer配置方式
Oct 30 Javascript
js 对象使用的小技巧实例分析
Nov 08 Javascript
Jquery异步上传文件代码实例
Nov 13 jQuery
node.js中Buffer缓冲器的原理与使用方法分析
Nov 23 Javascript
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
Apr 03 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
对javascript和select部件的结合运用
2006/10/09 PHP
PHP中常用数组处理方法实例分析
2008/08/30 PHP
2014过年倒计时示例
2014/01/31 PHP
简单谈谈favicon
2015/06/10 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python实现简易动态时钟
2018/11/19 Python
python实现人机猜拳小游戏
2020/02/03 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
电子商务专业学生的自我鉴定
2013/11/28 职场文书
户外宣传策划方案
2014/05/25 职场文书
学生党员公开承诺书
2014/05/28 职场文书
公安学专业求职信
2014/07/27 职场文书
公证委托书
2014/08/01 职场文书
旷工辞退通知书
2015/04/17 职场文书
微观世界观后感
2015/06/10 职场文书
辩论会主持词
2015/07/03 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL