Nodejs异步回调之异常处理实例分析


Posted in NodeJs onJune 22, 2018

本文实例讲述了Nodejs异步回调之异常处理。分享给大家供大家参考,具体如下:

目前我们项目的Nodejs异常是通过express nexterrorhandler 中间件去处理的,

原本以为此方法可以捕获到所有的异常,但事实发现并非如此。

下面以一个异常举例子:

req.get('',function(req, res, next){
 var a = undefined.b; // 产生了一个exception
})
req.use(function(){req, res, next}{
 next(); //最终到 errorhandler中间件中处理
})

上面这个例子中,我们人为的制造了一个excepteion,同时我们期望的结果是异常能进入到我们写好的handler中去做处理。

从上面代码的运行结果来看,也符合我们的预期。

如果换个地方抛出异常,结果就不是我们想要的了。

req.get('',function(req, res, next){
 redis.get('key', function(){
  var a = undefined.b; // 产生了一个exception
 })
})
req.use(function(){req, res, next}{
 next(); //最终到 errorhandler中间件中处理
})

上面的代码抛出的异常并不会被express捕获,也不会被next到我们的错误处理器中,而是会下面的代码捕获

process.on('uncaughtException', uncaughtExceptionHandler);

所以,nodejs中,异步回调中的异常是无法被外围的try catch捕获的。

req.get('',function(req, res, next){
 try{
  redis.get('key', function(){
   var a = undefined.b; // 产生了一个exception
  })
 }catch(e){
  //并不会进到这里来
 }
})

解决方案:

1. Promise

function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })
 })
}
promiseFun().then().catch();

2. Async await

var getAsync1 = await async1();
async function async1() {
return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })
 });
}
console.log(getAsync1);

But …

如果是下面这样写

function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   throw Error(); //依然捕获不到
  })
 })
}
promiseFun().then().catch();

是依然捕获不到的。

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
使用upstart把nodejs应用封装为系统服务实例
Jun 01 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 NodeJs
nodejs实现套接字服务功能详解
Jun 21 #NodeJs
详解Nodejs mongoose
Jun 10 #NodeJs
详解NodeJs开发微信公众号
May 25 #NodeJs
nodejs express配置自签名https服务器的方法
May 22 #NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 #NodeJs
解决nodejs的npm命令无反应的问题
May 17 #NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 #NodeJs
You might like
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
bootstrap日历插件datetimepicker使用方法
2016/12/14 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python获取当前日期和时间的方法
2015/04/30 Python
python&MongoDB爬取图书馆借阅记录
2016/02/05 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python ATM功能实现代码实例
2020/03/19 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
给女朋友的道歉信
2014/01/10 职场文书
校园之星获奖感言
2014/01/29 职场文书
六一节目主持词
2014/04/01 职场文书
团拜会策划方案
2014/06/07 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
先进个人申报材料
2014/12/30 职场文书
实习证明模板
2015/06/16 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
Js类的构建与继承案例详解
2021/09/15 Javascript