IE中JavaScript 的异常处理
错误类型
编程中我们会遇到四种错误:编译错误、逻辑错误、输入/验证错误、运行时错误,但是在JavaScript中我们只能最后两种错误。
JavaScript 1.5定义了六种错误类型:
- EvalError: Raised when the eval() functions is used in an incorrect manner.
- RangeError: Raised when a numeric variable exceeds its allowed range.
- ReferenceError: Raised when an invalid reference is used.
- SyntaxError: Raised when a syntax error occurs while parsing JavaScript code.
- TypeError: Raised when the type of a variable is not as expected.
- URIError: Raised when the encodeURI() or decodeURI() functions are used in an incorrect manner.
可以使用Error.name属性获取以上错误类型。如下代码:
function captureErrorType(error) { switch (error.name) { case 'SyntaxError': alert("caught a " + error.name + ": " + error.message); //handle error… break; case 'EvalError': alert("caught a " + error.name + ": " + error.message); //handle error… break; case 'ReferenceError': alert("caught a " + error.name + ": " + error.message); //handle error… break; default: alert("caught a " + error.name + ": " + error.message); //handle all other error types here… break; } }
错误捕获
使用try/catch
try/catch只能针对特定的某个方法,不能捕获所有的异常。
OnError对象
IE的window对象有个全局事件onerror,它可以捕获脚本中任何未被try/catch处理的最后一个错误。
示例代码:
//记录所有错误 function reportError(err) { var errMsg = []; for (var p in err) { if (err.hasOwnProperty(p)) { errMsg.push(p + "=" + err[p]); } } alert(errMsg.join("\n")); } window.onerror = function (message, url, line) { // 汇报错误 reportError({ message: message, url: url, line: line }); } function doSomething() { // error a(); } try { doSomething(); } catch (e) { throw e; } doSomething();
错误处理
客户端
在客户端捕获到错误信息可以:
1、 直接显示给用户
2、 作为日志输出
3、 使用ajax发送到服务器端
服务器端
服务器端接收到客户端回传过来的错误信息,可以
1、 作为日志输出
2、 存储到数据库,作为后续运维提供统计数据
3、 使用邮件,qq,微信,短信的形式发送给错误的干系人。
Error对象
在IE中使用try/catch可以获取的一个Error对象,这个对象有如下属性:
- name —— 异常对象名/类型
- message —— 错误提示信息
- description —— 和message属性相同
- number —— ErrorCode,错误代码
其中的number属性是一个整数,表示的是错误码,但这并不是真正的错误码,我们需要先将其做一下转换
var errCode = err.number& x0FFFF;
这得到真正的错误码,例如上述的-2146823279 转换之后就得到5009。有了这个错误码之后,我们可以到http://msdn.microsoft.com/en-us/library/1dk3k160(VS.85).aspx微软msdn上查找此错误码对应的。5009对应的错误是Undefined identifier。
错误码
错误有runtime error和syntax error两种。5开头的一般是runtime error,1开头的一般是syntax error。
运行时错误
|
|
语法错误
错误号 |
说明 |
1019 |
|
1020 |
|
1030 |
|
1027 |
|
1005 |
|
1006 |
|
1012 |
|
1003 |
|
1004 |
|
1032 |
|
1029 |
|
1007 |
|
1008 |
|
1009 |
|
1011 |
|
1033 |
|
1031 |
|
1023 |
|
1010 |
|
1028 |
|
1024 |
|
1014 |
|
1026 |
|
1025 |
|
1018 |
|
1002 |
|
1035 |
|
1016 |
|
1015 |