2016-10-05 21 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塊。