Nodejs异步回调之异常处理实例
目前我们项目的Nodejs异常是通过express next 到 errorhandler 中间件去处理的, 原本以为此方法可以捕获到所有的异常,但事实发现并非如此。 下面以一个异常举例子:
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 })//欢迎加入全栈开发交流圈一起学习交流:864305860 }) req.use(function(){req, res, next}{ next(); //最终到 errorhandler中间件中处理 })
上面的代码抛出的异常并不会被express捕获,也不会被next到我们的错误处理器中,而是会下面的代码捕获
process.on('uncaughtException', uncaughtExceptionHandler);
nodejs中,异步回调中的异常是无法被外围的try catch捕获的。
req.get('',function(req, res, next){ try{//欢迎加入全栈开发交流圈一起学习交流:864305860 redis.get('key', function(){ var a = undefined.b; // 产生了一个exception })//欢迎加入全栈开发交流圈一起学习交流:864305860 }catch(e){ //并不会进到这里来 } })
解决方案:
- Promise
function promiseFun() { return new Promise(function (resolve, reject) { redis.get('key', function(){ resolve("Hello"); // reject(); })//欢迎加入全栈开发交流圈一起学习交流:864305860 })//面向1-3年前端人员 }//帮助突破技术瓶颈,提升思维能力 promiseFun().then().catch();
- Async await
var getAsync1 = await async1(); async function async1() { return new Promise(function (resolve, reject) { redis.get('key', function(){ resolve("Hello"); // reject(); }) }); }//欢迎加入全栈开发交流圈一起学习交流:864305860 console.log(getAsync1);
But … 如果是下面这样写
function promiseFun() { return new Promise(function (resolve, reject) { redis.get('key', function(){ throw Error(); //依然捕获不到 }) }) }//欢迎加入全栈开发交流圈一起学习交流:864305860 promiseFun().then().catch();
结语
感谢您的观看,如有不足之处,欢迎批评指正。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
你的 Ubuntu 为何如此炫酷?
很多人觉得 Windows 是最好的操作系统,它的用户图形化交互界面、它的各种功能应用,还有它的易用性等方面完全就碾压一切,Linux 党对此表示不屑;又有很多人把 elementary OS 定义为最美的 Linux 发行版,Ubuntu 党跳出来对此表示不屑。啊~并不是想(打)引(去)战(吧),其实笔者觉得不管是 Windows 还是 Linux,不管是 Ubuntu 还是其它 Linux 发行版,都有自己的特点,至于当下为什么更多的人使用 Windows 而不是 Linux,其中一个大原因在于易用性和相应的配套应用与个性化设置,然而其实他们误会了已经发展到如今的 Linux 了,或者说有些人根本没接触过吧。 Linux 发展到今天,早已不再是只局限于服务器与嵌入式端了,作为个人日常使用的操作系统也完全是杠杠的。鉴于笔者是 Ubuntu 流,本文就以目前比较活跃的 LTS Ubuntu 18.04 为例,从系统安装到具体配置,再到如何个性化美化,一步步分享一下个人经验,让大家了解到 Linux 也可以像 Windows 那样简易;而对于 Ubuntu 党外人士,只想告诉他们,Ubu...
- 下一篇
【SpringBoot系列】SpringBoot注解详解
一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。 @Configuration 等同于spring的XML配置文件;使用java代码可以检查类型安全。 @EnableAutoConfiguration 自动配置。 @ComponentScan 组件扫描,可自动发现和装配一些Bean。 @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。 @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。 @Autowired自动导入。 @PathVariable获取参数。 @JsonBackReference解决嵌套外链问题。 @RepositoryR...
相关文章
文章评论
共有0条评论来说两句吧...