これは関連しているQ: 返品後の作業を行うためのfinally節の使用は、スタイルが悪い/危険ですか?
参照されるQでは、最終的に使用されるコードは、使用される構造とプリフェッチの必要性に関連しています。私の質問は少し異なりますが、より多くの聴衆にとって密接な関係があると思います。私の特定の例はC#winformアプリですが、これは最終的にC ++ / Javaの使用にも適用されます。
私は、ブロックに例外や例外処理/クリーンアップに関係のないコードがたくさんあるtry-catch-finallyブロックにかなり気付いています。そして、例外と処理に密接に関連するコードで非常にタイトなtry-catch-finallyブロックを作成するという私のバイアスを認めます。ここに私が見ているもののいくつかの例があります。
tryブロックには、スローされる可能性のあるコードに至るまでの多くの予備的な呼び出しと変数が設定されます。ロギング情報は、セットアップを取得し、tryブロックでも実行されます。
最後に、ブロックはform / module / controlのフォーマット呼び出し(catchブロックで表されるように、アプリが終了しようとしているにもかかわらず)を持ち、パネルなどの新しいオブジェクトを作成します。
大体:
methodName(...) { 試してみる { //メソッドの多くのコード... //スローできるコード... //メソッドとリターンのためのより多くのコードを... } catch(何か) {//例外を処理する} 最後に { //例外によるいくつかのクリーンアップ、クローズ //作成されたもののためのより多くのコード(例外がスローされる可能性があることを無視)... //さらにオブジェクトを作成します } }
コードは機能するため、何らかの価値があります。それはうまくカプセル化されておらず、ロジックは少し複雑です。私は(苦労して)コードを移動したりリファクタリングしたりするリスクに精通しているので、私の質問は、同様に構造化されたコードに関する他の人の経験を知りたいということになります。
悪いスタイルは変更を加えることを正当化しますか?同様の状況で誰かがひどくやけどをしたことがありますか?その悪い経験の詳細を共有してくれませんか?私が過剰に反応していて、スタイルがそれほど悪くないので、それを残してください?物事を片付けることのメンテナンスの利点を得る?
finally
C#で何ができるかは知っています)。C ++と同等のものは何ですか?私が考えているのはcatch
、の後のコードで、C#の後のコードにも同じことが当てはまりますfinally
。
Environment.FailFast()
。キャッチされない例外がある場合、実行されない場合があります。また、finally
手動で反復するイテレータブロックがある場合はさらに複雑になります。
finally
。すべての適切な使用法は、RAII / RRID / SBRM(好きな頭字語)でカバーされています。