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 div 遮罩层封锁整个页面
Jul 10 Javascript
Javascript学习笔记之相等符号与严格相等符号
Nov 23 Javascript
jquery图片切换插件
Mar 16 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
JS实现简单易用的手机端浮动窗口显示效果
Sep 07 Javascript
jQuery图片轮播功能实例代码
Jan 29 Javascript
vue中简单弹框dialog的实现方法
Feb 26 Javascript
基于JS实现html中placeholder属性提示文字效果示例
Apr 19 Javascript
js实现小球在页面规定的区域运动
Jun 16 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
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
Symfony页面的基本创建实例详解
2015/01/26 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
python调用虹软2.0第三版的具体使用
2019/02/22 Python
python实现名片管理系统项目
2019/04/26 Python
Python中的类与类型示例详解
2019/07/10 Python
python多线程同步实例教程
2019/08/11 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
Python re正则表达式元字符分组()用法分享
2020/02/10 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
销售类个人求职信范文
2013/09/25 职场文书
采购主管工作职责
2013/12/12 职场文书
小学敬老月活动方案
2014/02/11 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
社会实践评语
2014/04/28 职场文书
工厂车间标语
2014/06/19 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
Pandas 稀疏数据结构的实现
2021/07/25 Python
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android