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 日期计算算法
Sep 11 Javascript
JS 类型转换常见方法小结
May 31 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
很棒的Bootstrap选项卡切换效果
Jul 01 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
jQuery 实现倒计时天,时,分,秒功能
Jul 31 jQuery
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
Sep 27 jQuery
基于JavaScript实现省市联动效果
Jun 22 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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
PHP 命令行参数详解及应用
2011/05/18 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
js鼠标左右键 键盘值小结
2010/06/11 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
vuejs实现标签选项卡动态更改css样式的方法
2018/05/31 Javascript
vue实现日历备忘录功能
2020/09/24 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
jQuery实现简单轮播图效果
2020/12/27 jQuery
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
Django 多环境配置详解
2019/05/14 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
MATCHESFASHION.COM美国官网:英国奢侈品零售商
2018/10/29 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
先进教师事迹材料
2014/12/16 职场文书
土建技术员岗位职责
2015/04/11 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸