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的模块写法入门(实例代码)
Mar 07 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
nodejs基础应用
Feb 03 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
php截取字符串函数分享
2015/02/02 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
JS+XML 省份和城市之间的联动实现代码
2009/10/14 Javascript
JS重要知识点小结
2011/11/06 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
JavaScript利用append添加元素报错的解决方法
2014/07/01 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
jQuery实现的超简单点赞效果实例分析
2015/12/31 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
python中将字典转换成其json字符串
2014/07/16 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
python 求1-100之间的奇数或者偶数之和的实例
2019/06/11 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
学校校庆演讲稿
2014/05/22 职场文书
计划生育标语
2014/06/23 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
学校捐款活动总结
2015/05/09 职场文书
《静夜思》教学反思
2016/02/17 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python
vue递归实现树形组件
2022/07/15 Vue.js