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 相关文章推荐
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
JavaScript 继承的实现
Jul 09 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
Dec 19 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
Jun 23 Javascript
js中this的用法实例分析
Jan 10 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
vue.js学习之递归组件
Dec 13 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
JavaScript鼠标拖拽事件详解
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
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
Python GAE、Django导出Excel的方法
2008/11/24 Python
python进阶教程之循环对象
2014/08/30 Python
python清理子进程机制剖析
2017/11/23 Python
python删除过期log文件操作实例解析
2018/01/31 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
python reverse反转部分数组的实例
2018/12/13 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
python判断自身是否正在运行的方法
2019/08/08 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
基于PyTorch中view的用法说明
2021/03/03 Python
使用Html5实现异步上传文件,支持跨域,带有上传进度条
2016/09/17 HTML / CSS
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
国税会议欢迎词
2014/01/16 职场文书
优秀团支部申报材料
2014/12/26 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技