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 相关文章推荐
使用nodejs、Python写的一个简易HTTP静态文件服务器
Jul 18 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
Yii框架弹出框功能示例
2017/01/07 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
使用C语言扩展Python程序的简单入门指引
2015/04/14 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python列表对象实现原理详解
2019/07/01 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
秋游活动策划方案
2014/02/16 职场文书
白岩松演讲
2014/05/21 职场文书
公司市场部岗位职责
2015/04/15 职场文书
运动会广播稿20字
2015/08/19 职场文书
七年级上册生物的课件
2019/08/07 职场文书
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python