您的位置:首页 > Web前端 > Node.js

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

2017-09-01 11:36 513 查看
《深入浅出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..');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: