NodeJS之异常处理
1. 为什么要处理异常?
如果我们不处理异常的话,直接会导致程序奔溃,用户体验比较差,因此我们要对异常进行处理,当出现异常的情况下,我们要给用户一个友好的提示,并且记录该异常,方便我们排查。
2. 在Node.js中常用的异常处理方式有哪些?
2.1 使用try catch方式来处理异常,如下代码:
try {
throw new Error('error');
} catch(e) {
console.log('异常被捕获了,我现在还可以继续执行了');
console.log(e);
}
然后执行命令行时候,可以看到如下,也会打印后面的 console.log的信息了;如下所示:

但是使用 try catch 无法处理异步代码块内出现的异常,比如如下代码:
try {
setTimeout(() => {
throw new Error('error');
})
} catch(e) {
console.log('异常被捕获了,我现在还可以继续执行了');
console.log(e);
}
在命令行中打印信息如下:

可以看到,catch里面的console.log(''); 代码并没有被执行。说明catch里面的代码异常并没有被捕获到。
2.2 使用event方式来处理异常
const events = require('events');
// 创建一个事件监听对象
const emitter = new events.EventEmitter();
// 监听error事件
emitter.addListener('error', (e) => {
// 处理异常信息
console.log(11122222); // 能打印 1112222 说明异常捕获到了
console.log(e);
});
// 触发 error事件
emitter.emit('error', new Error('你代码出错了'));
执行效果如下图所示:

2.3 callback的方式
比如读取一个文件,或者创建一个目录,测试代码如下:
const fs = require('fs');
fs.mkdir('/dir', (e) => {
if (e) {
console.log('异常信息处理');
console.log(e);
} else {
console.log('创建目录成功');
}
});
然后执行结果如下图所示:

2.4 Promise方式
new Promise((resolve, reject) => {
throw new Error('error');
}).then(() => {
// 。。。。
}).catch((e) => {
console.log('能进来说明可以处理异常信息了');
console.log(e);
});
执行结果如下图所示:

如上是处理同步代码,但是如果是异步代码呢?继续如下代码测试:
new Promise((resolve, reject) => {
setTimeout(() => {
throw new Error('error');
}, 100);
}).then(() => {
// 。。。。
}).catch((e) => {
console.log('能进来说明可以处理异常信息了');
console.log(e);
});
然后执行结果如下所示:

可以看到,Promise也是一样无法捕获异步代码中的异常信息了。
2.5 Async/Await 方式
Async/Await 也是基于Promise的,Promise是无法捕获异步异常,因此Async/Await 也是没有办法捕获的。如下测试代码:
先看同步代码可以捕获到的,代码如下:
const testFunc = function() {
return new Promise((resolve, reject) => {
throw new Error('error');
});
};
async function testAsync() {
try {
await testFunc();
} catch (e) {
console.log('能进来,说明异常能处理');
console.log(e);
}
}
testAsync();
执行结果如下所示:

我们再看异步代码,如下所示:
const testFunc = function() {
setTimeout(() => {
console.log(1111);
return new Promise((resolve, reject) => {
throw new Error('error');
});
}, 100);
};
async function testAsync() {
try {
await testFunc();
} catch (e) {
console.log('能进来,说明异常能处理');
console.log(e);
}
}
testAsync();
如下图所示:

2.6 process 方式(该方式既可以处理同步代码的异常,也可以处理异步代码的异常)。
如下同步代码异常:
process.on('uncaughtException', (e) => {
console.log('我能进来,说明可以处理异常');
console.log(e);
});
function testFunc() {
throw new Error('error');
}
testFunc();
执行结果如下所示:

异步代码如下所示:
process.on('uncaughtException', (e) => {
console.log('我能进来,说明可以处理异常');
console.log(e);
});
function testFunc() {
setTimeout(() => {
throw new Error('error');
}, 100);
}
testFunc();
如下图所示:

2.7 domain 方式
domain也可以处理任何类型异常的信息,包含同步和异步。
如下同步代码所示:
const domain = require('domain');
const d = domain.create();
d.on('error', (e) => {
console.log('我能进来,说明能处理异常');
console.log(e);
});
d.run(() => {
throw new Error('同步代码处理');
});
如下图所示:

异步代码如下所示:
const domain = require('domain');
const d = domain.create();
d.on('error', (e) => {
console.log('我能进来,说明能处理异常');
console.log(e);
});
d.run(() => {
setTimeout(() => {
throw new Error('异步代码处理');
}, 100);
});
如下图所示:

NodeJS之异常处理的更多相关文章
- Nodejs异步异常处理domain
前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...
- NodeJS文件读取:感恩常在--抓把糖果,愉悦客人
通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...
- 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔
守护进程 方案一 npm install forever https://github.com/foreverjs/forever 方案二 npm install -g supervisor http ...
- 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?
被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在E ...
- restify构建REST服务(转)
restify构建REST服务 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Java ...
- NodeJS异常处理uncaughtException篇
很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: thro ...
- nodejs异常处理过程/获取nodejs异常类型/写一个eggjs异常处理中间件
前言 今天想写一下eggjs的自定义异常处理中间件,在写的时候遇到了问题,这个错误我捕获不到类型?? 处理过程,不喜欢看过程的朋友请直接看解决方法和总结 看一下是什么: 抛出的异常是检验失败异常Val ...
- NodeJs之数据库异常处理
数据库异常 NodeJs版本:4.4.4 数据库链接错误 使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西.操作数据库是我们常用的功能.通过回调 ...
- NodeJS入门(五)—— process对象
process对象用于处理与当前进程相关的事情,它是一个全局对象,可以在任何地方直接访问到它而无需引入额外模块. 它是 EventEmitter 的一个实例. 本章的示例可以从我的Github上下载到 ...
随机推荐
- springboot情操陶冶-web配置(八)
本文关注应用的安全方面,涉及校验以及授权方面,以springboot自带的security板块作为讲解的内容 实例 建议用户可直接路由至博主的先前博客spring security整合cas方案.本文 ...
- 提升学习算法简述:AdaBoost, GBDT和XGBoost
1. 历史及演进 提升学习算法,又常常被称为Boosting,其主要思想是集成多个弱分类器,然后线性组合成为强分类器.为什么弱分类算法可以通过线性组合形成强分类算法?其实这是有一定的理论基础的.198 ...
- golang判断文件是否存在
判断一个文件是否存在是一个相当常见的需求,在golang中也有多种方案实现这一功能. 现在我们介绍其中两种最常用也是最简单的实现,第一种将是跨平台通用的,而第二种则在POSIX平台上通用. 跨平台实现 ...
- docker修改国内官方镜像
在正常情况下,docker有一个默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,但是国内毕竟不是国外,由于国情不同,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境, ...
- Android开发——EditText的属性使用
最近使用的EditText控件,有些属性不太清楚,做一下笔记 判断EditText中内容是否为空 EditText多行显示 android:inputType="textMultiLin ...
- Hdu 3001 Travelling 状态DP
题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...
- mybatis基础(中)
数据模型分析思路 每张表记录的数据内容 分模块对每张表记录对内容进行熟悉,相当于学习系统需求(功能)的过程 每张表重要的字段设置 非空字段.外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的 ...
- SD详解-销售过程
http://www.sapzh.com/html/Financial/SD/3113.html 7 销售过程 7.1销售执行 目的 作用与目的描述 步骤 操作过程/步骤描述 备 ...
- python运行逻辑
Python程序在解释器上执行分两个过程: 编译:如果Python进程在机器上拥有写入权限,那么它会把程序的字节码保存为一个以 .pyc 为扩展名的文件.当程序运行后,会在源代码的同一个目录下看到 . ...
- Dynamics 365出现数据加密错误怎么办?
本人微信公众号:微软动态CRM专家罗勇 ,回复290或者20181227可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...