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面向对象特性代码实例
Jun 12 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
Nov 15 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
对于js垃圾回收机制的理解
Sep 14 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
Apr 17 jQuery
在vue中解决提示警告 for循环报错的方法
Sep 28 Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 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
需要发散思维学习PHP
2009/06/29 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP查询分页的实现代码
2017/06/09 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
js获取系统的根路径实现介绍
2013/09/08 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
Tensorflow卷积神经网络实例
2018/05/24 Python
python实现简单五子棋游戏
2019/06/18 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
大学新生军训自我鉴定
2014/03/18 职场文书
小学生植树节活动总结
2014/07/04 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
小学教师求职信范文
2015/03/20 职场文书
父母教会我观后感
2015/06/17 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书