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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
NodeJS配置CORS实现过程详解
Dec 02 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
python实现telnet客户端的方法
2015/04/15 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
利用python批量修改word文件名的方法示例
2017/10/17 Python
Python实现进程同步和通信的方法
2018/01/02 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
python监控文件并且发送告警邮件
2018/06/21 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
Python使用贪婪算法解决问题
2019/10/22 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
如何用python批量调整视频声音
2020/12/22 Python
python中re模块知识点总结
2021/01/17 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
小学生家长评语大全
2014/02/10 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
工作决心书范文
2014/03/11 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电