JavaScript中的Trampolining - 如何在递归调用中处理try / catch

时间:2016-01-31 00:58:04

标签: javascript node.js recursion exception-handling trampolines

我有一个用Javascript编写的递归函数,由于过度深度递归而给出RangeError。因此,我使用蹦床进行尾部优化。这已将函数调用包装在while循环中,并且我已经摆脱了RangeError。但我需要处理递归函数内的抛出异常(返回一级并进行一些纠正处理)。使用蹦床时,我不知道如何处理这种情况。

我的原始递归函数(简化为插图):

function process (val, level){
   if(val < 0 ){
     throw new negativeException(val);
   }
   for(var i=0; i< num; i++){
       try{
         //do some processing on val
         process (val, level+1);
         return;
       }
       catch(e){
         //do some different processing on val and use i as well
       }
    } 
 }

function process (val, level)

我使用trampolining(ref:Understanding recursion in functional JavaScript programming

更新了递归函数
function trampoline(f) {
  try{
    while (f && f instanceof Function) {
        f = f();
    }
   } catch(e) {
     //catching exception in trampoline
   }
   return f;
}

function callProcess(val, level){
   function process(val, level){
     if(val < 0 ){
       throw new negativeException(val);
     }
     for(var i=0; i< num; i++){ 
        try{
          //do some processing on val
          return process.bind(null, val, level+1); /updated recursive call
        }
        catch(e){
         //do some different processing on val and use i as well
        }
     }
 }
 return trampoline(process.bind(null, pstate,level));
}

function callProcess(val, level)

使用更新的代码,只要val不是负数且没有抛出异常,我就可以避免RangeError。但是当val变为负数并抛出异常时,我直接进入trampoline catch块。但我需要回到进程()的catch块一级。

您能否建议我如何实现这一目标?谢谢你的帮助!我查看了一些相关的帖子,但无法找出我需要的解决方案。

0 个答案:

没有答案