【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 条评论
登录 后参与评论

相关文章

来自专栏杂七杂八

列表、字典、集合中筛选数据

传统迭代法 data = [1,5,-3,-2,8,0,9] res = [] for x in data: if x >=0: res...

38560
来自专栏noteless

javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码

然后使用      65------>$ 另外一种解码方式解读,显然A就变成了$,这不就是乱码了么

20830
来自专栏自动化测试实战

flask第十一篇——自定义url转换器

39360
来自专栏博客园

Asp.Net Web API(三)

    在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action。当We...

17750
来自专栏Java编程技术

Dubbo剖析-增强SPI的实现

在Duboo剖析-整体架构分析中介绍了dubbo中除了Service 和 Config 层为 API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以...

14410
来自专栏电光石火

关于PHP字符编码的函数区别

在以前的学习当中,比方说有一次的写采集过程中转换字符的编码的时候老是失败,转换的结果总没有完全输出,后来经过网络查询得知是iconv有一个“-”漏洞,所以我们有...

26080
来自专栏微信公众号:Java团长

《深入理解Java虚拟机》笔记

也就是说,我们完全可以做一个工具,从一个文件中读入指令,然后将这些指令运行起来。上面代码中“编好的机器指令”当然指的是能在CPU上运行的,如果这里我还实现了一个...

6810
来自专栏C#

C#创建安全的栈(Stack)存储结构

    在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等结构,各种结构采用的存储的方式存在...

22260
来自专栏深度学习之tensorflow实战篇

python如何保存矩阵,保存matrix,保存numpy.ndarray

问题:如何将array保存到txt文件中?如何将存到txt文件中的数据读出为ndarray类型?python如何保存矩阵,保存matrix,保存numpy.nd...

3.1K60
来自专栏九彩拼盘的叨叨叨

glob 介绍

glob 最早是出现在类Unix系统的命令行中, 是用来匹配文件路径的。比如,lib/**/*.js 匹配 lib 目录下所有的 js 文件。

9730

扫码关注云+社区

领取腾讯云代金券