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 相关文章推荐
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
Package.js  现代化的JavaScript项目make工具
May 23 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
关于Node.js的events.EventEmitter用法介绍
Apr 01 Javascript
解析Angular 2+ 样式绑定方式
Jan 15 Javascript
vuex 的简单使用
Mar 22 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
puppeteer实现html截图的示例代码
Jan 10 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
Dec 30 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 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 缓存函数代码
2008/08/27 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
JS实现self的resend
2010/07/22 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
vue 封装 Adminlte3组件的实现
2020/03/18 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python 自动化表单提交实例代码
2017/06/08 Python
使用python实现knn算法
2017/12/20 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python实现人像动漫化的示例代码
2020/05/17 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
教育系毕业生中文求职信范文
2013/10/06 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
政工师工作总结2015
2015/05/26 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
Python初识逻辑与if语句及用法大全
2021/08/07 Python
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
Django框架中视图的用法
2022/06/10 Python