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);
});

如下图所示:

原文地址:https://www.cnblogs.com/tugenhua0707/p/10597568.html

时间: 2024-10-31 20:51:08

NodeJS之异常处理的相关文章

Nodejs异步异常处理domain

前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nodejs都是异步异常,try..catch根本就捕捉不到,就会给我们的程序设计带来不小的麻烦,经常会有未处理的runtime异常,让整个系统挂掉. 目录 Nodejs异常处理 Nodejs异步异常处理 domain介绍 domain的API介绍 domain异步异常特例 1. Nodejs同步异常处理

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

守护进程 方案一 npm install forever https://github.com/foreverjs/forever 方案二 npm install -g supervisor http://www.cnblogs.com/pigtail/archive/2013/01/08/2851056.html 被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单

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

被吐嘈的NodeJS的异常处理 许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在Express的作者的TJ Holowaychuk的告别Node.js一文中列举了以下罪状: Farewell NodeJS (TJ Holowaychuk) ?   you may get duplicate callbacks?   you may not get a callback at al

NodeJS异常处理uncaughtException篇

NodeJS异常处理uncaughtException篇 王龑 — APRIL 08, 2015 很多 NodeJS 的开发者在抱怨异常处理太麻烦,我们会通过一些列博客梳理一下NodeJS中常见的异常处理的手段. 和大多数编程语言一样,在 NodeJS 里可以通过throw抛出一个异常: throw new Error('Catch me'); 为了捕获这个异常需要把代码包在Try Catch中: try{ throw new Error('Catch me'); }catch(e){ // e

nodejs读取mongodb返回数据到前台页面[object object]异常处理

第二步中的<%- %>尤为重要,不然会出现不可预见的错误,如非法字符'_'或者非法字符'o'等异常 版权声明:本文为博主原创文章,未经博主允许不得转载.

nodejs学习资料

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

NodeJS常用模块介绍

收集了NodeJS开发中常用的一些模块. MVC框架 - Express Express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站.Express框架建立在Nodejs内置的Http模块上,并对Http模块再包装,从而实际Web请求处理的 功能.它支持多种前端模板,如Jade, EJS等.它是T.J大神的作品,不过已经交由其它团队维护了. Koa是T.J大神的另外一个作品,号称下一 代NodeJS web框架.使用 koa 编写 web 应用,通过组合不同的 generat

七天学会NodeJS

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS

NodeJS入门(五)—— process对象

process对象用于处理与当前进程相关的事情,它是一个全局对象,可以在任何地方直接访问到它而无需引入额外模块. 它是 EventEmitter 的一个实例. 本章的示例可以从我的Github上下载到(敏感时期GFW发大招,git暂时传不了,等多几天风头过了再试着上传). 事件'exit' 当进程将要退出时触发.这是一个在固定时间检查模块状态(如单元测试)的好时机.需要注意的是 'exit' 的回调结束后,主事件循环将不再运行,所以计时器也会失效: process.on('exit', func