質問

だから今朝、このようなコードに出くわしました:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

このコードは正常にコンパイルされ、正常に動作しますが、特に関連する最終的なものがある場合は、tryブロック内から戻るのは適切ではないと感じます。

主な問題は、最終的に自分自身の例外をスローした場合に何が起こるかです。返された変数だけでなく、処理する例外もあるので、他の人がtryブロック内から戻ることについてどう思うか知りたいですか?

役に立ちましたか?

解決

いいえ、悪い習慣ではありません。 returnを意味のある場所に置くと、読みやすさと保守性が向上し、コードが理解しやすくなります。 finallyステートメントが検出された場合、<=>ブロックが実行されるため、気にする必要はありません。

他のヒント

最終的には何が実行されても、重要ではありません。

個人的には、finallyステートメントの前にreturnステートメントを見たくないので、この種のコーディングは避けます。

私の心はシンプルで、物事をかなり直線的に処理します。したがって、ドライランニングのコードを調べると、returnステートメントに到達できれば、その後のすべてが問題になることはないと思う傾向があります。副作用の可能性がある)。

したがって、returnステートメントが常にfinallyステートメントの後に表示されるようにコードを配置します。

これはあなたの質問に答えるかもしれません

実際に何が起こるかtry {return x; }最後に{x = null; }ステートメント?

その質問を読むと、例外をスローする可能性があると思われる場合、finallyステートメントに別のtry catch構造を持つことができるように思えます。コンパイラーは、いつ値を返すかを判断します。

とはいえ、コードを再構築する方が、後で混乱したり、これを知らない人を混乱させたりしないようにする方が良いかもしれません。

機能的に違いはありません。

ただし、これを行わない理由は1つあります。多くの場合、複数の出口点を持つ長いメソッドは、読み取りと分析がより困難です。しかし、その反対は、catchやfinallyブロックよりも、returnステートメントに関係しています。

あなたの例ではどちらの方法も同等ですが、コンパイラが同じコードを生成したとしても驚かないでしょう。 finallyブロックで例外が発生した場合、returnステートメントをブロック内に配置しても外部に配置しても、同じ問題が発生します。

実際の質問は、スタイル的に最適です。 returnステートメントが1つだけになるようにメソッドを記述するのが好きです。この方法では、メソッドからのフローが見やすくなります。したがって、returnステートメントを最後に配置して、メソッドの終わりとこれが返すもの。

returnステートメントが最後のステートメントとしてきちんと配置されていると、他のユーザーは来てメソッドの別の部分に複数のreturnステートメントを振りかける可能性が低くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top