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 模块开发及发布详解分享
Mar 07 NodeJs
nodejs之请求路由概述
Jul 05 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
node快速搭建后台的实现步骤
Feb 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
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHP数组相关函数汇总
2015/03/24 PHP
php简单判断文本编码的方法
2015/07/30 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
如何离线执行php任务
2017/02/21 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
IntelliJ IDEA 安装vue开发插件的方法
2017/11/21 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
js html实现计算器功能
2018/11/13 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
python线程池的实现实例
2013/11/18 Python
python递归计算N!的方法
2015/05/05 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
opencv实现简单人脸识别
2021/02/19 Python
Python如何执行系统命令
2020/09/23 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
有机童装:Toby Tiger
2018/05/23 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
博柏利美国官方网站:Burberry美国
2020/11/19 全球购物
2014年会演讲稿范文
2014/01/06 职场文书
环保建议书
2014/03/12 职场文书
就业意向书范文
2014/04/01 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
Redis性能监控的实现
2021/07/09 Redis
Sql Server之数据类型详解
2022/02/28 SQL Server