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极简入门教程(三):进程
Oct 27 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
Nodejs实现多人同时在线移动鼠标的小游戏分享
Dec 06 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
用jquery模仿的a的title属性(兼容ie6/7)
2013/01/21 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python实现视频读取和转化图片
2019/12/10 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
python 实现批量图片识别并翻译
2020/11/02 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
客户经理岗位职责
2013/12/08 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
生日寄语大全
2014/04/08 职场文书
2014年创卫工作总结
2014/11/24 职场文书
2015年财政所工作总结
2015/04/25 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
小学班主任研修日志
2015/11/13 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书