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下打包模块archiver详解
Dec 03 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
Nodejs 和 Electron ubuntu下快速安装过程
May 04 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 NodeJs
详解NodeJS模块化
Jun 15 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判断文件夹是否存在不存在则创建
2015/04/09 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
网页中可关闭的漂浮窗口实现可自行调节
2013/08/20 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
js 与 php 通过json数据进行通讯示例
2014/03/26 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python中函数的用法实例教程
2014/09/08 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
Scrapy模拟登录赶集网的实现代码
2020/07/07 Python
Python如何对齐字符串
2020/07/30 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
中学生期末评语
2014/02/03 职场文书
护士个人自我鉴定
2014/03/24 职场文书
教师师德演讲稿
2014/05/06 职场文书
商场促销活动策划方案
2014/08/18 职场文书
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python