なぜ「continue」ステートメントを「finally」ブロック内に置くことができないのですか?

finally ブロックは、例外がスローされるかどうかに関係なく実行されます。例外がスローされた場合、一体どうなる continue 行う?キャッチされない例外が別の関数に制御を移すため、ループの実行を続行できません。

例外がスローされなくても finally return のように、try/catch ブロック内の他の制御転送ステートメントが実行されたときに実行されます 、たとえば、同じ問題を引き起こします。

つまり、finally のセマンティクスで finally 内から制御を移すことを許可するのは意味がありません その外側にブロックします。

意図した動作をより明確にする簡単な回避策があるため、いくつかの代替セマンティクスでこれをサポートすることは、役立つというよりも混乱を招きます。したがって、エラーが発生し、問題について適切に考える必要があります。これは、C# で行われている一般的な "成功の穴に投げ込む" という考え方です。

例外を無視して (多くの場合、それは悪い考えです)、ループの実行を続行するには、catch all ブロッ​​クを使用します:

foreach ( var in list )
{
    try{
        //some code
    }catch{
        continue;
    }
}

continue にしたい場合 キャッチされていない例外がスローされない場合のみ、 continue と入力します try ブロックの外側。


信頼できる情報源は次のとおりです:

MSDN 8.9.2 The continue statement から引用 .

ドキュメントには次のように書かれています:

ここから 8.10 try ステートメント .


理にかなっていると思うかもしれませんが、意味がありません

foreach (var v in List)
{
    try
    {
        //Some code
    }
    catch (Exception)
    {
        //Some more code
        break; or return;
    }
    finally
    {
        continue;
    }
}

休憩の目的は何ですか または続ける 例外がスローされたとき? C# コンパイラ チームは、break を想定して独自に決定することを望んでいません。 または continue .代わりに、finally block から制御を移すには開発者の状況があいまいになると不平を言うことにしました。 .

したがって、コンパイラが別のことを想定するのではなく、何をしようとしているのかを明確に述べるのが開発者の仕事です。

これがコンパイルされない理由を理解していただければ幸いです!