10

次のコード スニペット/例があります。これは、catch について質問し、最後に返すためにこれを書いたばかりのコードではありません。

try
{
    doSomething();
}
catch (Exception e)
{
    log(e);
    return Content("There was an exception");
}
finally
{
    Stopwatch.Stop();
}
if (vm.Detail.Any())
{
    return PartialView("QuestionDetails", vm);
}
else
{
    return Content("No records found");
}

try ブロックに例外がある場合、私が理解していることから、それはキャッチされます。ただし、catch に return ステートメントがある場合、finally は実行されますか? これは catch と finally をコーディングする正しい方法ですか?

4

5 に答える 5

14

処理された例外内で、関連する finally ブロックが実行されることが保証されます。ただし、例外が未処理の場合、finally ブロックの実行は、例外アンワインド操作がどのようにトリガーされるかに依存します。これは、コンピューターのセットアップ方法によって異なります。詳細については、「CLR での未処理の例外処理」を参照してください。

参照: Try-Finally

于 2012-08-28T09:38:31.273 に答える
10

はい、前に何かfinallyあったとしても、実行されます。return

finally ブロックは、try ブロックで割り当てられたリソースをクリーンアップしたり、try ブロックで例外が発生した場合でも実行する必要があるコードを実行したりするのに役立ちます。通常、finally ブロックのステートメントは、通常の実行、break、continue、goto、または return ステートメントの実行、または例外の伝播の結果として制御の移動が発生するかどうかに関係なく、制御が try ステートメントを離れたときに実行されます。 try ステートメントから。

詳しくは

MSDN - try-finally (C# リファレンス)

于 2012-08-28T09:37:59.427 に答える
4

ブロックfinally内でリターンがあっても実行されるcatch

finally ブロックは常に実行されます

于 2012-08-28T09:38:07.023 に答える
3

finally、catch-block が終了した後に実行されます (明示的な "return" によって)。ただし、finally ブロック (この場合は)ののすべては実行されません。if (vm.Detail.Any()) ...

于 2012-08-28T09:38:47.440 に答える
2

catch ブロックに return ステートメントがあっても、finally ブロックのコードは実行されます。ただし、個人的には結果を変数に代入し、ブロックの後に返します。しかし、それは単なる好みの問題です。

于 2012-08-28T09:40:26.260 に答える