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 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
jQuery+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
jQuery Mobile 导航栏代码
Nov 01 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
Javascript中的arguments对象
Jun 20 Javascript
ES6所改良的javascript“缺陷”问题
Aug 23 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
Jul 11 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
Aug 08 Javascript
Mongoose中document与object的区别示例详解
Sep 18 Javascript
Vue props中Object和Array设置默认值操作
Jul 30 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
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
FF IE浏览器修改标签透明度的方法
2014/01/27 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
JS的数组迭代方法
2015/02/05 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
python内存管理分析
2015/04/08 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python实现把类当做字典来访问
2019/12/16 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
家庭户外服装:Hawkshead
2017/11/02 全球购物
会计电算化专业应届大学生求职信
2013/10/22 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
个人汇报材料范文
2014/12/30 职场文书
长城导游词400字
2015/01/30 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技
 python中的元类metaclass详情
2022/05/30 Python