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之异常处理的更多相关文章

  1. Nodejs异步异常处理domain

    前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...

  2. NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

    通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...

  3. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办? foreverjs, 文摘随笔

    守护进程 方案一 npm install forever https://github.com/foreverjs/forever 方案二 npm install -g supervisor http ...

  4. 拿什么守护你的Node.JS进程: Node出错崩溃了怎么办?

    被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在E ...

  5. restify构建REST服务(转)

    restify构建REST服务 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Java ...

  6. NodeJS异常处理uncaughtException篇

    很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: thro ...

  7. nodejs异常处理过程/获取nodejs异常类型/写一个eggjs异常处理中间件

    前言 今天想写一下eggjs的自定义异常处理中间件,在写的时候遇到了问题,这个错误我捕获不到类型?? 处理过程,不喜欢看过程的朋友请直接看解决方法和总结 看一下是什么: 抛出的异常是检验失败异常Val ...

  8. NodeJs之数据库异常处理

    数据库异常 NodeJs版本:4.4.4 数据库链接错误 使用nodejs处理异常最麻烦不过,这里我抛开nodejs提供的domain和一些第三方库专门处理的东西.操作数据库是我们常用的功能.通过回调 ...

  9. NodeJS入门(五)—— process对象

    process对象用于处理与当前进程相关的事情,它是一个全局对象,可以在任何地方直接访问到它而无需引入额外模块. 它是 EventEmitter 的一个实例. 本章的示例可以从我的Github上下载到 ...

随机推荐

  1. .NET快速信息化系统开发框架 V3.2 -> Web 用户管理模块编辑界面-组织机构选择支持级联选择

    下拉框级联选择功能非常的实用,框架用户管理编辑界面对组织机构的选择在3.2版本中新增了级联选择的支持,让组织机构的选择更加的方便与高效,也不容易出错. 我们框架的组织机构结合实际分成了5种类型,分别为 ...

  2. 阿里云HBase全新发布X-Pack 赋能轻量级大数据平台

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

  3. MySQL ProxySQL相关维护说明

    背景: 前面的2篇文章MySQL ProxySQL读写分离使用初探和MySQL ProxySQL读写分离实践大致介绍了ProxySQL的使用说明,从文章的测试的例子中看到ProxySQL使用SQLIT ...

  4. Angularjs1.X进阶笔记(1)—两种不同的双向数据绑定

    一. html与Controller中的双向数据绑定 html-Controller的双向数据绑定,在开发中非常常见,也是Angularjs1.x的宣传点之一,使用中并没有太多问题. 1.1数据从ht ...

  5. 第42章 发现(discovery) - Identity Server 4 中文文档(v1.0.0)

    可以在*https://baseaddress/.well-known/openid-configuration*找到发现文档.它包含有关IdentityServer的端点,密钥材料和功能的信息. 默 ...

  6. 第34章 授予类型 - Identity Server 4 中文文档(v1.0.0)

    授权类型是指定客户端如何与IdentityServer交互的方式.OpenID Connect和OAuth2.0规范定义了以下授权类型: Implicit Authorization code Hyb ...

  7. Jquery 强大的表单验证操作

    参考资料: 1.https://www.cnblogs.com/linjiqin/p/3431835.html(此篇最佳) 2.https://blog.csdn.net/pengjunlee/art ...

  8. C# 判断用户是否对路径拥有访问权限

    如何获取当前系统用户对文件/文件夹的操作权限? 1.获取安全信息DirectorySecurity DirectorySecurity fileAcl = Directory.GetAccessCon ...

  9. C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容

    序 在前面的文章C# 如何插入.修改.删除Word批注一文中介绍了如何操作Word批注的一些方法,在本篇文章中继续介绍操作Word批注的方法.分以下三种情况来介绍: 1. 插入图片到Word批注 2. ...

  10. JAVA_接口_默认方法&静态方法

    1.小结(注意): 1.接口中无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰 2.接口中,没有构造方法,不能创建对象 3.接口中,没有静态代码块 ...