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中使用monk访问mongodb
Jul 06 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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用header函数实现301跳转代码实例
2013/11/25 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
让您的菜单不离网站
2006/10/03 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
2017/12/27 jQuery
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
python学习 流程控制语句详解
2016/06/01 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python循环输出三角形图案的例子
2019/11/22 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
机械电子工程专业推荐信范文
2013/11/20 职场文书
十岁生日同学答谢词
2014/01/19 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
预备党员群众意见
2015/06/01 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
使用MybatisPlus打印sql语句
2022/04/22 SQL Server