【Node.js】一个愚蠢的Try Catch过错

  前段时间学习《深入浅出Nodejs》时,在第四章 - 异步编程中作者朴灵曾提到,异步编程的难点之一是异常处理,书中描述"尝试对异步方法进行try/catch操作只能捕获当次事件循环内的异常,对call back执行时抛出的异常将无能为力"。

  果然,项目测试过程中,连续两天遇到了Node.js进程Crash的问题。通过Debug Log,究其原因,发现正是书中提到的问题。

  例如,  

 1 //test.js
 2 
 3 var test = undefined;
 4 
 5 try{
 6     var f1 = function(){
 7          console.log(test.toString());  
 8     }
 9 }
10 catch(e){
11     console.log('error..');
12 }
13 
14 //assume somewhere f1() will be called as an call back function
15 f1();

这里模仿f1函数是做为call back(回调)函数传递给其他函数,在其他函数执行过程中执行call back的函数。从代码表面来看,很容易认为如果Line 7

1 console.log(test.toString());

如果这行code发生异常,会自然认为其会被try catch捕获到,并不会引起进程的Crash。但其实,运行结果是:

运行错误,Line 11的错误并没有打印,说明在程序中错误没有被Try Catch。而Nodejs作为单进程单线程程序,将会引起进程的Crash!

  --------------------------------------------------------------------------------------------------------------

  因此,在进行异步编程时,个人觉得:

要考虑到call back函数可能产生的错误,增加类型检查代码或在Call back被真正执行的地方增加Try cach等,避免异常未能被捕获导致进程Crash

  --------------------------------------------------------------------------------------------------------------

  如本例,可修改如下,

1 if(typeof(test) != 'undefined'){
2     console.log(test.toString());  
3 }

  或者

1 console.log(test? test.toString() : '[undefine]');

  或者

1 try{
2     f1();
3 }
4 catch(e)
5 {
6     console.log('new error..');
7 }

  这样,再次运行程序,就可以避免异常,避免进程的Crash。

小结:  

  在Node.js中,非常多的异步调用API,在执行API,传入Call back函数时,一定要注意Call back函数里可能发生的错误,如果没有被正常的Try catch到或者其他方式避免,就有可能导致进程的Crash。

  Best Regards

  Kevin Song

                                                   2014/6/25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微服务那些事儿

关键数据变更监控

在经过了对mybatis的一番检索之后,没有发现对该需求的解决方式.在认知范围内,想到了使用mabatis拦截器解决该问题。

59119
来自专栏BinarySec

unexploitable Writeup[pwnable.tw]

最近在刷pwnable.tw(类似pwnable.kr,不过是台湾的)的题,看到了一个unexploitable的题目。根据题目描述:

672
来自专栏PHP技术

良好的书写规范提高PHP代码执行效率

用单引号代替双引号来包含字符串,这样做会更快一些。因为 php 会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多...

2535
来自专栏程序员宝库

JAVA 中异常处理的最佳实践

前言 异常处理的问题之一是知道何时以及如何去使用它。我会讨论一些异常处理的最佳实践,也会总结最近在异常处理上的一些争论。 作为程序员,我们想要写高质量的能够解决...

2848
来自专栏用户2442861的专栏

2014 360校园招聘技术类面试题

451
来自专栏编程

Golang中defer 的五个坑-第三部分

译注:全文总共有四篇,本文为同系列文章的第三篇 本文将侧重于讲解使用 defer 的一些技巧 如果你对 defer 的基本操作还没有清晰的认识,请先阅读这篇文章...

1925
来自专栏java达人

为什么需要Spring Ioc

如果没有没有亲自做过一些项目,直接上手就学spring那样的框架,你可能会觉得莫名其妙,有java就够了呀,为什么要学习这么一个陌生的东西。框架其实是软件的半成...

2196
来自专栏java一日一条

Java初学者必知:Java语言的11大特点

Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的静态语言。那么java语言的特点是什么呢?

312
来自专栏Java3y

Mybatis面试题

Mybatis常见面试题 #{}和${}的区别是什么? {}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递...

4644
来自专栏LuckQI

redis初识~String命令介绍

1083

扫码关注云+社区