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实现HTTPS发起POST请求
Apr 23 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
一个数据采集类
2007/02/14 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
浅谈Angular单元测试总结
2019/03/22 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
毕业生自荐书模版
2014/01/04 职场文书
网络信息管理员岗位职责
2014/01/05 职场文书
写给女生的道歉信
2014/01/14 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
员工年终考核评语
2014/12/31 职场文书
英文升职感谢信
2015/01/23 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书