码迷,mamicode.com
首页 > 其他好文 > 详细

try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),

时间:2017-09-01 11:52:49      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:console   tostring   导致   增加   fun   erro   on()   llb   var   

《深入浅出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..);
}

 

try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),

标签:console   tostring   导致   增加   fun   erro   on()   llb   var   

原文地址:http://www.cnblogs.com/liujinyu/p/7462461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!