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实现的动态文字变换
Jul 28 Javascript
当json键为数字时的取值方法解析
Nov 15 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
PHP开发者必须掌握的6个关键字
Apr 14 Javascript
js实现文章文字大小字号功能完整实例
Nov 01 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
jQuery EasyUI提交表单验证
Jul 19 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
Jun 13 Javascript
微信小程序实现打开内置地图功能【附源码下载】
Dec 07 Javascript
uni-app之APP和小程序微信授权方法
May 09 Javascript
详解VUE调用本地json的使用方法
May 15 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 如何向 MySQL 发送数据
2006/10/09 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
javascript验证身份证号
2015/03/03 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
webpack实用小功能介绍
2018/01/02 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python中尾递归用法实例详解
2015/04/28 Python
在Python中操作列表之List.pop()方法的使用
2015/05/21 Python
python中引用与复制用法实例分析
2015/06/04 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python将文本去空格并保存到txt文件中的实例
2018/07/24 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
药学专业个人的自我评价
2013/12/31 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
法制宣传日活动总结
2014/04/29 职场文书
美术社团活动总结
2014/06/27 职场文书
英文感谢信范文
2015/01/21 职场文书
社区重阳节活动总结
2015/03/24 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle