-5

finallyブロックは常にブロックの後に呼び出されることを読みましたtry catch

私には状況があります(構文的に行かないでください)

状況 1:-

try
{    
  return 1;
}
catch()
{
  return 2;
}
finally()
{
  Console.WriteLine("ABCD");
}

そして別の状況: -

状況 2:-

try
{
  System.Environment.Exit(1);
}
catch()
{
   return 2;
}
finally()
{
  Console.WriteLine("ABCD");
}

私の質問は、コードが try ブロックに入ると、両方の状況でfinallyブロックが実行されるということですか? そうでない場合は、その理由を説明してください。

私の理解では、それexitはシステムコールでreturnあり、関数呼び出しです。

4

5 に答える 5

11

returnfinally ブロックではステートメントを使用できないため、どちらの例もコンパイルされません。これは、最初の状況はあり得ないことを意味し、実際に対処する必要はありません。

設計上、内でリターンしてtryfinallyブロックが実行されます。

2 番目の状況については、一般に、はい -finallyブロックが実行されます。ただし、を呼び出すEnvironment.FailFastと、このメソッドは具体的に次のようになります。

アクティブな try/finally ブロックまたはファイナライザーを実行せずにプロセスを終了します。

その場合、finally ブロックは発生しません。Environment.Exit(またはタイプ呼び出し)など、プロセスを「終了」する他のメソッドは、Application.Shutdown通常、ブロック内のコードを実行することに注意してください。finally


編集すると、最初のfinallyブロックが実行されます。

最初のケースでは、returnはブロックの実行 tryをトリガーします。finally

2 番目はEnvironment.Exitすぐにプロセスを終了し、finally は実行されません。のドキュメントで指定されているように、状況 2 の catch ブロックも実行されないことに注意してください。Environment.Exit

Exit が try または finally ブロックから呼び出された場合、catch ブロック内のコードは実行されません。return ステートメントを使用すると、catch ブロック内のコードが実行されます。

あなたの最後の行については:

私の理解では、exit はシステム コールで、return は関数呼び出しです。

これは真実ではありません。 return関数呼び出しではなく、制御フロー用 の言語指定のジャンプ ステートメントです。Environment.Exit実際にはメソッド呼び出し (クラスExit内のメソッド) です。Environment

于 2013-08-06T15:43:38.690 に答える
5

状況 1

finally ブロックが実行されます。通常のシナリオでは、finallyブロックは常に実行されます。

ドキュメントには、強調して次のように記載されています。

通常、finally ブロックのステートメントは、制御が try ステートメントを離れたときに実行されます。制御の移動は、通常の実行、break、continue、goto、returnステートメントの実行、または try ステートメントからの例外の伝播の結果として発生する可能性があります。

状況 2

これは通常のシナリオではありません。を呼び出すとEnvironment.Exit()、プロセスはすぐに終了し、finallyブロックは実行されません。

ドキュメントはこれを明確にしていません。Environment.Exit()ただし、への呼び出しの内部は Win32 API 関数へのExitProcess()呼び出しであり、その関数への呼び出しは決して返されないことに賭ける準備ができています。

于 2013-08-06T15:54:27.253 に答える
4

returnC#finallyブロックでは使用できません。実際には、 を除いて、フロー制御コマンドは許可されていませんthrow。いいえreturn、いいえbreak、いいえ、何もありません。

そしてfinallyブロックがまったく実行されない場合、それは呼び出されませんfinallybut maybe. ブロックは実行されることが保証されます( VM が RAM を使い果たしたり、誰かfinallyがコンピューターからプラグを抜いたりしない限り)。returnthrowtrycatch

于 2013-08-06T15:42:27.927 に答える