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 url验证(url-valid)的使用方法
Nov 18 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
nodejs实现爬取网站图片功能
Dec 14 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 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框架的性能
2008/01/10 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python获取标准北京时间的方法
2015/03/24 Python
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
学习Django知识点分享
2019/09/11 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
html5 迷宫游戏(碰撞检测)实例一
2013/07/25 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
运动会开幕式解说词
2014/02/05 职场文书
开学寄语大全
2014/04/08 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
北京英文导游词
2015/02/12 职场文书
银行催款通知书
2015/04/17 职场文书