Node.js异常分类:
- 变量异常
- 函数异常
- 调用异常
变量异常
- 未定义变量
var c = a + b; //a,b没有定义
- 未包含对象
var a = {prop: 1};
console.log(a.prop2.1); //prop2位undefined,读取属性1的时候会报异常。
- 变量类型错误
var str = "string";
JSON.stringfy(str); //str为string类型的不是JSON类型的。
函数异常
- 函数未声明
- 函数回调异常
- 待回调函数同步返回
- 回调函数中抛出错误
调用异常
- 对象与数组
var arr = [1, 2, 3];
var obj = {'1': '1', '2': '2', '3': '3'};
console.log(arr[4]);
console.lor(obj[4]);
var objArr = [{'test': 1},{'test': 2}];
objArr[0]['test'];
objArr[2];
objArr[2]['test'];
- exports和module.exports
exports只能返回一个对象。
module.exports可以返回多种数据类型。
常见的保护逻辑
- 变量声明
以上面的“对象数组”的异常为例:
if(typeof objArr[2] == 'object'){
console.log(objArr[2]['test']);
}else{
console.log('It is not an object.');
}
- 调用前判断
var testObject = {'test': 1};
if(typeof testObject == 'object'){
console.log(JSON.stringfy(testObject));
}else{
console.log('It is not an object.');
}
- 类型判断
使用try...catch
try{
callErr();
}catch(err){
console.log(err);
}
function callErr(){
var s = wrong + true;
console.log(someSth);
}
try...catch可以保证同步情况下的异常处理,无法保证异步情况下的异常处理。例如如下代码便会抛出错误。
try{
callErr();
}catch(err){
console.log(err);
}
function callErr(){
setTimeout(function(){
var s = wrong + true;
console.log(someSth);
}, 10);
}
如果想保证异步执行的错误处理需要用到domain。
var domain = require('domain');
var d = domain.create();
d.on('error', function (err) {
console.log(err);
});
function callErr(){
setTimeout(function(){
var s = wrong + true;
console.log(someSth);
}, 10);
}
d.run(function () {
callErr();
});
domain适用于一些异步回调的处理逻辑。
网友评论