欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NodeJs之error

程序员文章站 2022-06-01 09:32:47
...

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 nodejs error