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

Posted 刘金宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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..);
}

 

以上是关于try catch 小结 , node的回调callback里不能捕获异常 , 不能被v8优化(现在能了),的主要内容,如果未能解决你的问题,请参考以下文章

javascript Try-Catch同步回调

Solidity极简入门#30. Try Catch

node fs 解决回调地域问题

Nodejs:catch块中的回调函数在try-catch中返回未定义的参数

C 回调中的 try catch(...) - 坏主意?

Node.JS - 无法使用try / catch块获得异步抛出