• 【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

      

      

  • 相关阅读:
    JS高手
    如何删除textarea的移动版Safari的阴影?
    如何删除textarea的移动版Safari的阴影?
    CSS3----background:-webkit-gradient()渐变效果
    a:hover和a:visited书写顺序的重要性
    【经验】在CSS中定义a:link、a:visited、a:hover、a:active顺序
    领导干部要敢于担当
    关于cookie, iphone及chrome的异同
    刘云山:领导干部要敢于担当
    Javascript中Function,Object,Prototypes,__proto__等概念详解
  • 原文地址:https://www.cnblogs.com/KevinSong/p/3808188.html
Copyright © 2020-2023  润新知