2016-10-05 3 views
1

try 블록이 재귀와 함께 작동하는 방법에 대한 설명이 필요합니다. 이 실행하면 프로그램이 이제까지 try로 전환하는 경우try catch 블록에 대한 재귀 작업은 어떻게됩니까?

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

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

       //... 
      } 
     } 
    } 
} 

이, 무슨 일이 발생합니다

내가이 구조라는 함수 thisFunction을 말해봐?

catch에 다시 가기 전에 thisFunction()이 한번 실행되어 다시 실행되어 다시 try 블록에 빠지면 어떻게됩니까?

catch(...)에 갈 것입니까?

답변

1

프로그램을 실행하면 프로그램이 실행되면 어떻게됩니까?

언제든지 try/catch 범위가 입력 될 때와 동일한 현상이 발생합니다.

합니까 thisFunction()는 try 블록이 입력 될 때 try 블록 내부 사업의 첫 번째 순서로, 다음 thisFunction()가 호출됩니다 즉시 호출 thisFunction() 때문에 한 번

실행합니다. 여기에 놀라움이 없습니다.

는 이제까지도 예외가 try 블록 내에서 발생되는 경우, 물론, catch 블록이 그것을 잡을 것 캐치 (...)

로 이동합니다 제공 할 것이라는 던져진 예외는 catch과 일치합니다.

재귀 호출은 변경되지 않습니다. 이 함수에 대한 재귀 호출에서 예외가 발생하면 재귀 호출이 수행되지 않은 것과 똑같은 방식으로 예외가 catch되거나 catch되지 않으며 동일한 try 블록 내에서 예외가 발생합니다.

실행이 try 블록에 들어가면 다이가 캐스팅됩니다. 일치하는 예외가 발생하면 catch 블록에 걸립니다. 실행 스레드가 자연스럽게 try 범위를 벗어날 때까지는 마찬가지입니다. 그때까지는, 일치하는 예외가 슬로우되면 (자) 캐치됩니다.

재귀 호출이 동일한 try 블록을 입력하고 예외가 발생하면 예외는 재귀 호출의 catch 블록에 의해 캐치됩니다. 예외가 발생하면 실행 스레드에서 가장 가까운 일치하는 catch 블록에 의해 catch되고 해당 스택에서 스택이 해제됩니다.

1

재귀는 여전히 다른 어떤 것과 마찬가지로 함수 호출이며, 단지 스스로를 호출하는 함수입니다.

다음 반복을 호출 할 때 thisFunction()을 호출 할 때마다 try/catch 블록이 있습니다.어떤 thisFunction()의 반복이 예외가 발생하는 경우 예상대로 예외 가까운 일치 catch 블록 적발한다.

이전의 thisFunction() 반복의 catch 일 경우 해당 반복의 catch은 다른 예외와 마찬가지로 처리 될 새로운 예외를 throw합니다. thisFunction을 여러 번 반복의 경우, 예외가 잡힌 결국 예외가 초기 thisFunction() 전화를 탈출 할 때까지 발생하고 중 재귀를 시작하는 처음 thisFunction()를 호출 한 코드에 따라 잡힐 여부됩니다되는 것입니다.

+0

그래서 캐치 거의 쓸모가 될 수 있도록 기능의 대부분이 try 블록에없는 때문에 작동하지 않을 것입니다 스택 방법을 사용하여 반복적 인 기능이 될이 원한다면. 코드를 완전히 재구성하지 않고이 문제를 해결할 수있는 방법이 있습니까? – randomhereok

+0

정확히 무엇을 성취하려고합니까? 더 구체적으로 말하십시오. –

+0

전체 함수를 반복적으로 만듭니다. 잠재적으로 스택 오버플로가 발생하지 않습니다. try catch (또는 적어도 반복 된 루프가 예외 catch를 catch 할 때마다) 또는 최선의 접근 방법이 아닌 경우 try catch를 유지하면서 그렇게 할 수있는 방법이 있는지 궁금합니다. while 루프를 사용하여 반복 횟수를 최대화 할 수는 있지만 경기 침체를 완전히 피하고 싶습니다. – randomhereok

0

중첩의 try catch 블록 단지와 유사한이 하나, 모든 시도는 동급 스택에서 각각의 캐치를 가지고 있으며, 각각에 대한 예외가 발생했을 경우는 각각의 catch 블록을 실행합니다보십시오.