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创建基础应用并应用模板引擎
Apr 12 NodeJs
nodejs简单实现操作arduino
Sep 25 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
nodejs实现UDP组播示例方法
Nov 04 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
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
javascript replace()正则替换实现代码
2010/02/26 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
详解vue 命名视图
2019/08/14 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
Python实现把xml或xsl转换为html格式
2015/04/08 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
Python的Lambda函数用法详解
2019/09/03 Python
python模拟实现分发扑克牌
2020/04/22 Python
python实现简单的学生管理系统
2021/02/22 Python
德国足球商店:OUTFITTER
2019/05/06 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
整改报告格式
2014/11/06 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
Nginx的反向代理实例详解
2021/03/31 Servers
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python