NodeJs之error

Error

错误。

NodeJs应用程序一般会有四种错误:

  • 标准的JavaScript错误;
  • 由底层操作系统触发的系统错误;
  • 由应用程序代码触发的用户自定义的错误;
  • AssertionError错误,当Node监测到不应该发生的异常逻辑时触发,这类错误通常来自assert模块;

所有由Nodejs引起的Javascript错误与系统错误都继承自或实例化自标准的JavaScript类,
且保证至少提供类中的属性。

错误的冒泡和捕获

异常捕获处理try...catch

// 抛出一个 ReferenceError,因为 z 未定义。
try {
  const m = 1;
  const n = m + z;
} catch (err) {
  // 在这里处理错误。
}

回调中的Error参数

大多数Nodejs核心API所提供的异步方法都遵从错误信息优先的回调模式惯例,这种模式有时也称为Nodejs回调。

但JavaScript的try…catch机制不能用来截获异步方法产生的错误。

try {  
     setTimeout(function () {
        throw new Error('async error'); // 抛出一个异常错误,这是因为异步函数执行上下文不同,所以捕获不到。
    }, 1000);
} catch (e) {
    console.log(e);
}

为了捕获异步产生的异常错误,可以用domain模块。

var domain = require('domain');
var d = domain.create();
d.run(function () {
    setTimeout(function () {
        throw new Error('async error'); // 抛出一个异步异常
    }, 1000);
});

d.on('error', function (err) {
    console.log(err); // 这里可以捕获异步异常
});

或者express挂载接受error函数

app.use(function (err,req,res,next){
   //前面的中间件的错误next(err),都在这里接收。
});

Error类

new Error(message):新建一个Error实例,创建一个异常错误对象;
throw new Error(message):创建一个对象并抛出错误,如果不捕获则node崩溃;

error.code:标识错误类别的字符标签;
error.message:错误描述;
error.stack:一个字符串;

AssertionError类

表明断言的失败。

ReferenceError类

表明试图访问一个未定义的变量。
此类错误通常表明代码有拼写错误或程序已损坏。

SyntaxError类

表明程序不是有效的JavaScript。

TypeError类

表明提供的参数不是被允许的类型。

NodeJs中常用的异常处理方式

// 每秒钟打印一次时间,确保程序没有奔溃
(function loop() {
    console.log(new Date().getTime())
    setTimeout(function () {
        loop() 
    }, 1000)
})()
// 模拟同步代码块内出现异常
let syncError = () => {
    throw new Error('Sync Error')
}
// 模拟异步代码块内出现异常
let asyncError = () => {
    setTimeout(function () {
        throw new Error('Async Error')
    }, 100)
}


1. 
try {
    syncError()
} catch (e) {
    /*处理异常*/
    console.log(e.message)
}
console.log('异常被捕获了,我可以继续执行')

2. callback方式
fs.mkdir('/dir', function (e) {
    if (e) {
        /*处理异常*/
        console.log(e.message)
    } else {
        console.log('创建目录成功')
    }
})

3. event方式
let events = require("events");
//创建一个事件监听对象
let emitter = new events.EventEmitter();
//监听error事件
emitter.addListener("error", function (e) {
    /*处理异常*/
    console.log(e.message)
});
//触发error事件
emitter.emit("error", new Error('出错啦'));

4. Promise方式
new Promise((resolve, reject) => {
    syncError()
    /* or
    try{
        syncError()
    }catch(e){
        reject(e)
    }
    */
})
.then(() => {
    //...
})
.catch((e) => {
    /*处理异常*/
    console.log(e.message)
})
Promise同样无法处理异步代码块中抛出的异常
new Promise((resolve, reject) => {
    asyncError()
})
.then(() => {
    //...
})
.catch((e) => {
    /*异常无法被捕获,导致进程退出*/
    console.log(e.message)
})

5. Async/Await方式
var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        syncError()
    })
};

(async function () {
    try {
        await sleep(100);
    } catch (e) {
        /*处理异常*/
        console.log(e.message)
    }
})()

6. process方式(可以捕获任何异常,但过于笨重)
process.on('uncaughtException', function (e) {
    /*处理异常*/
    console.log(e.message)
});
asyncError()
syncError()

7. domain方式(也可以处理任何异常模块)
let domain = require('domain')
let d = domain.create()
d.on('error', function (e) {
    /*处理异常*/
    console.log(e.message)
})
d.run(asyncError)
d.run(syncError)

你可能感兴趣的:(Node)