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)
推荐阅读
-
PHP Fatal error: Call to undefined function bcmul()_PHP教程
-
Mysql启动中 InnoDB: Error: log file ./ib_logfile0 is of diff_MySQL
-
webgame中Mysql Deadlock ERROR 1213 (40001)错误的排查历程_MySQL
-
php开发之文件上传
-
Android组件之DrawerLayout实现抽屉菜单
-
23种设计模式之工厂方法模式
-
Symfony2框架学习笔记之HTTP Cache用法详解_PHP
-
HTML5 常见面试题之PC端和移动端区别介绍
-
thinkphp结合云之讯做短信验证码
-
Laravel 5框架学习之Blade 简介,laravelblade_PHP教程