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和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
详解nodejs爬虫程序解决gbk等中文编码问题
Apr 06 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
Nodejs中的require函数的具体使用方法
Apr 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
PHP调用三种数据库的方法(1)
2006/10/09 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
JavaScript 常用函数
2009/12/30 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
js单例模式的两种方案
2013/10/22 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
js实现简单的倒计时
2021/01/28 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
基于python实现从尾到头打印链表
2019/11/02 Python
python3 字符串知识点学习笔记
2020/02/08 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
python动态规划算法实例详解
2020/11/22 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
企业务虚会发言材料
2014/10/20 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
2015年护士工作总结范文
2015/03/31 职场文书