2016-10-05 50 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ブロックに入った時にthisFunction()をすぐに起動されますので、一度

実行し、tryブロック内のビジネスの最初の順序として、そしてthisFunction()が呼び出されます。ここに驚きはありません。

は、それは今までにも例外が tryブロック内でスローされた場合、その後、もちろん、 catchブロックは、それをキャッチするキャッチ(...)

に行くに提供することスローされた例外はcatchと一致します。

再帰呼び出しはそれを変更しません。この関数への再帰呼び出しで例外がスローされた場合、例外は再帰呼び出しが行われなかった場合とまったく同じ方法で捕捉されます。同じ例外が同じtryブロック内のどこにでもスローされます。

実行がtryブロックに入ると、ダイがキャストされます。一致する例外がスローされると、catchブロックによってキャッチされます。実行スレッドが自然にtryのスコープから離れるまで、これは真のままです。それまでは、一致する例外がスローされた場合、それは捕捉されます。

再帰呼び出しで同じtryブロックが入力され、例外がスローされると、例外は再帰呼び出しからcatchブロックによってキャッチされます。例外がスローされると、実行スレッド内の最も近い一致するcatchブロックによってキャッチされ、スタックはそのポイントに戻されます。

1

再帰はまだ他の関数呼び出しと同じように機能しています。

thisFunction()を呼び出すたびに、次の繰り返しを呼び出すときには、try/catchブロックがあります。の反復がthisFunction()である場合、例外は最も近い一致するcatchブロックによって予期されるようにキャッチされます。

それは以前thisFunction()反復のcatchであることを起こる場合は、その反復のcatchは、他の例外と同じように処理される新しい例外をスローします。 thisFunctionの複数の反復では、例外はキャッチされ続け、最終的に例外が最初のthisFunction()呼び出しをエスケープし、再帰を開始するために初めてというコードで捕捉されるかどうかによってスローされます。

+0

これを反復関数にしたければ、関数の大部分がtryブロックにないのでスタックメソッドを使用しても機能しませんでしたので、キャッチは無駄になります。コードを完全に再構築せずにこれを行う方法はありますか? – randomhereok

+0

あなたは正確に何を達成しようとしていますか?より具体的にしてください。 –

+0

関数全体を反復的にします。潜在的にスタックをオーバーフローさせる代わりに。 try catch(または少なくとも繰り返しループで例外エラーが発生してcatchがcatchするたびに)、または最良の方法がない場合は、少なくともtry catchを保持する方法があるかどうか疑問に思っています。 whileループを使用して反復回数を最大限に増やすことはできますが、私は不況を避けたいと思います。 – randomhereok

0

これはネストされたtry catchブロックに似ています。すべてのtryクラスはそれぞれのクラススタックにキャッチされています。例外が発生した場合、それぞれtryブロックはそれぞれcatchブロックを実行します。

関連する問題