zoukankan      html  css  js  c++  java
  • try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),

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

    //test.js
    var test = undefined;
    try{
        var f1 = function(){
             console.log(test.toString());  
        }
    }
    catch(e){
        console.log('error..');
    }
    //assume somewhere f1() will be called as an call back function
    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]');

      或者

    try{
        f1();
    }
    catch(e)
    {
        console.log('new error..');
    }
  • 相关阅读:
    内存映射文件原理探索(转载)
    虚拟内存原理
    CSAPP-链接
    CSAPP-程序优化
    CSAPP-过程调用,数据存储,缓冲区溢出
    【数学,方差运用,暴力求解】hdu-5037 Galaxy (2014鞍山现场)
    【贪心+一点小思路】Zoj
    【几何模板加点小思路】hdu-4998 Rotate
    【背包问题】【出来混总是要还的...】总结+入门练手题
    【优先队列】【最近连STL都写不出来了/(ㄒoㄒ)/~~】hdu_5360/多校#6_1008
  • 原文地址:https://www.cnblogs.com/liujinyu/p/7462461.html
Copyright © 2011-2022 走看看