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 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
配置nodejs环境的方法
May 13 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 NodeJs
详解nodejs内置模块
May 06 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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的库,结果发现很多东西
2006/12/31 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JS原生数据双向绑定实现代码
2017/08/14 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
python的Template使用指南
2014/09/11 Python
python中异常捕获方法详解
2017/03/03 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
numpy.where() 用法详解
2019/05/27 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
python热力图实现简单方法
2021/01/29 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
美国校园市场:OCM
2017/06/08 全球购物
优秀求职信范文分享
2013/12/19 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
大学活动邀请函
2014/01/28 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
综合办公室主任岗位职责
2014/04/13 职场文书
自我推荐信范文
2014/05/09 职场文书
本科应届生自荐信
2014/06/29 职场文书
委托证明范本
2014/11/25 职场文书
2014年基建工作总结
2014/12/12 职场文书
详解TypeScript的基础类型
2022/02/18 Javascript