2016-10-05 136 views
1

我需要澄清一个try块如何与递归工作。递归如何针对try catch块进行工作?

说我有一个名为thisFunction函数这种结构:

thisfunction() 
{ 
    if (...) 
    { 
     //... 
    } 
    else 
    {  

      if() 
      { 
       try { 
        thisFunction() 
       } 
       catch(...) { 
        throw exception() 
       } 

       //... 
      } 
     } 
    } 
} 

当这个运行时,如果程序不断进入try,会发生什么?

是否才去catch如果碰巧重新运行,并再次落入trythisFunction()运行一次?

将它曾经甚至去到catch(...)

回答

1

当这个运行,如果程序不断进入试,会发生什么?

当进入try/catch范围,在其他任何时间发生同样的事情。

不thisFunction()运行一次

由于thisFunction()立即调用,为企业的try块内的第一顺序,然后thisFunction()将在进入try块时调用。这里没有惊喜。

将它曾经甚至去到catch(...)

如果异常的try块内抛出,那么,当然catch块将抓住它,前提是抛出的异常匹配catch

的递归调用不会改变这一点。如果有异常被在递归调用抛出这个功能,那么异常会或不会在完全相同的方式捕获过程如同递归调用不是造的,相同的异常被抛出其他地方一样try块内。

一旦执行进入try块,模具浇铸。如果匹配的异常被抛出,它将被catch块捕获。直到执行线程自然离开try作用域为止。在此之前,如果抛出匹配的异常,它将被捕获。

现在,如果递归调用进入相同的try块,并且抛出异常,则异常将被递归调用中的catch块捕获。当一个异常被抛出时,它会通过最近的匹配catch块,在执行线程抓,堆栈被解开这一点。

1

递归仍是一个函数调用就像任何其他,这恰好是一个函数调用本身。

每次调用thisFunction()呼叫下一个迭代时都有自己的try/catch块。如果的任何迭代的thisFunction()引发异常,则会按预期的方式通过最接近的匹配catch块捕获异常。

如果这恰好是以前的thisFunction()迭代的catch,那么该迭代的catch将抛出一个新的异常,将像其他任何异常一样处理。对于thisFunction的多次迭代,例外情况将继续被捕获并抛出,直到最终异常会跳过初始的thisFunction()调用,并且将被捕获或者不被第一次调用thisFunction()的代码启动递归。

+0

所以,如果我想这成为一个迭代函数,使用堆栈方法将不起作用,因为大部分函数不在try块中,所以catch几乎没用。没有完全重构代码,有没有办法解决这个问题? – randomhereok

+0

你究竟想要完成什么?请更具体一些。 –

+0

使整个函数迭代。而不是可能溢出堆栈。我想知道是否还有办法这样做,仍然保持try catch(或者至少每当重复循环发生异常错误时catch会抓住它),或者如果不是,最好的方法是什么。我知道我可以使用while循环进行最大数量的迭代,但我想完全避免经济衰退。 – randomhereok

0

这个与嵌套try catch块相似,每次尝试都会在它的类堆栈中分别捕获它,并且如果发生异常,它将分别尝试执行相应的catch块。