Nodejs异常处理

为何要处理异常?

1.不处理直接致使程序奔溃,这显然不是咱们想要的

2.致使请求没法被释放,直至链接超时。用户体验体验很是差,咱们要作的应该是在出错时,给用户一个友好的提示,并记录下这次异常,以便排查。

Node.js中经常使用的异常处理方式

// 每秒钟打印一次时间,确保程序没有奔溃
(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)
}

一、try catch 方式

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

可是try catch方式没法处理异步代码块内出现的异常,你能够理解为执行catch时,异常尚未发生。javascript

try {
    asyncError()
} catch (e) {
    /*异常没法被捕获,致使进程退出*/
    console.log(e.message)
}

clipboard.png

二、callback方式

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

三、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('出错啦'));

四、Promise 方式

new Promise((resolve, reject) => {
    syncError()
    /* or
    try{
        syncError()
    }catch(e){
        reject(e)
    }
    */
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*处理异常*/
        console.log(e.message)
    })

Promise一样没法处理异步代码块中抛出的异常java

new Promise((resolve, reject) => {
    asyncError()
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*异常没法被捕获,致使进程退出*/
        console.log(e.message)
    })

clipboard.png

五、Async/Await 方式

Async/Await是基于Promise的,因此Promise没法捕获的异常,Async/Await一样没法捕获dom

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        syncError()
    })
};

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

六、process方式

process方式能够捕获任何异常(无论是同步代码块中的异常仍是异步代码块中的异常)异步

process.on('uncaughtException', function (e) {
    /*处理异常*/
    console.log(e.message)
});
asyncError()
syncError()

七、domain方式

process方式虽然能够捕获任何类型的异常,可是process太过笨重,除了记录下错误信息,其余地方不适合使用,domain这个也能够处理任何类型异常的模块,显然是一个不错的选择。async

let domain = require('domain')
let d = domain.create()
d.on('error', function (e) {
    /*处理异常*/
    console.log(e.message)
})
d.run(asyncError)
d.run(syncError)
相关文章
相关标签/搜索