2012-03-29 11 views
6

例外をスローするケースに到達できないブレークステートメントを残すのは私の愚かなことですか?私の守備的な部分は、論理が変わった場合にそこに残したいと思っています。私の別の部分は、他の開発者が自分のコードでコンパイラの警告を見るのを望んでいません( "Unreachable code detected")。私は例外をスローする場合に到達不能な休憩を残すべきですか?

switch (someInt) 
{ 
    case 1: 
     // Do something 
     break; 
    case 2: 
     // Do something else 
     break; 
    case 3: 
     // Oh, we don't use threes here! 
     throw new Exception("Business rules say don't use 3 anymore"); 
     break; // Unreachable...until the fickle business rules change... 
    default: 
     throw new Exception("Some default exception"); 
     break; // Unreachable...until...well, you get the idea. 
} 

UPDATE

私は後日スローを削除するとコンパイルエラーを引き起こすだろうと言って、いくつかの回答を参照してください。しかし、単純にスローを取り除く(またはコメントする)だけでは、それを破棄することなくケースをスタックすることになり、意図しない振る舞いになる可能性があります。私はそれが起こりそうなシナリオだと言っているわけではないが...まあ、可能性の高いシナリオとの戦いについて防御的なプログラミングですか?

+1

'break 'はもはや必要ではなく、私は警告としてエラーとしてビルドするので、私はそれらを削除します。 – asawyer

+1

興味深い質問 - 私の最初の反応は、break文を含めることですが、それは純粋に癖になると思います。 – KazR

+1

プラグマの警告を無効にするあなたの懸念が有効だと思っても、他の人には不便を感じないようにするには、過度の防御をしてコードベースを素早く乱雑にすることができます – Michael

答えて

6

私は」それらを取り除く。いくつかの理由:あなたはエラーとして警告していると仮定すると(警告このタイプからのノイズの本当の警告を失うことができるよう

  • あなたは
  • は警告の多くを見た瞬間にそれらを必要としませんが、常に私を神経質になりますオフ)。
+0

「本当のエラー?コードがコンパイルされないか、警告が「実際のエラー」ではないと判断した(つまり、「警告をエラーとして処理する」フラグでビルドしない)。 – Michael

+1

上記で生成された150の警告がノイズであり、警告を生成するものが導入されていれば、それは見逃しやすいでしょう。 – gbanfill

0

ロジックが変更された場合、私の守備側はそこに残したいと思っています。

正確なロジックはここで変更されることがありますか?例外がスローされたときに起こることは、かなりうまく文書化されています。そして、あなたは、C#への後のリビジョンが "これまでに書かれたすべてのプログラムはもはや働いていません"という大きさの変更に影響しないことは合理的に確信できると思います。

コンパイラの警告がなくても、定期的なメンテナンス中にバグが発生する可能性がない限り、冗長コードは有効ではありません。この場合、このような可能性は合理的には言えません存在する。

+0

例外が取り除かれても、あなたはどちらか一方を持つ必要があります。 –

+0

おそらく私はそこで間違った用語を使用しましたが、いいえ、私はC#の仕様が変わっても、気まぐれなビジネスルールしか意味しません。 –

0

私の守備的な部分は、ロジックが変わった場合にそこに残したいと思っています。

throwを削除して、breakを追加することを忘れた場合は、コンパイラがお知らせします。

休憩がある理由はありません。それは冗長で、とにかく警告を発するだけなので、私はそれを削除します。あなたのロジックを混乱させるような無用なコードを残す理由はありません。

+2

休憩なしでスローを取り除くだけで、ケースが積み重なることになり、意図しない動作になる可能性があります。 –

+0

@TimLehner:体が空になるのでそうです。それは...あなたが体を空のままにしておけば、私はあなたが理由でそれをしたと仮定します。私はあなたの同僚がスイッチの仕組みの基礎を知っていることを信頼できることを願っています。 –

+0

私たちは皆同じ事を望んでいないのですか? :) –

1

削除します。

これは、警告を取り除くと、論理が変化したと例外を削除する場合でも、あなたはブレークに戻って追加する必要があるというコンパイラエラーを受け取るだろう。

+0

警告だけでなく、エラーになります。 –

+0

@EdS。そうです、私の間違いです。 – Brandon

+0

実際には両方が間違っている場合があります。例外が削除され、何も追加されない場合、本体は空になり、警告またはエラーなしにフォールスルーが可能になります。 –

2

コンパイラの警告を無視すると、コンパイラの警告を無視するという悪い動作が強化されます。私の意見では、それはbreakのステートメントを残して得られる利点よりも大きなリスクです。

EDIT:私はthrow文が削除された場合、バックでbreak文を入れて、あなたを強制的にコンパイラについての私の原点を削除しました。 payoが指摘するように、場合によっては、コンパイラはそうではないでしょう。それはちょうどそれをその下のものと組み合わせるだろう。

+0

コンパイラは、ケースに他のコードがない場合(スローのコメント後に)ブレークを追加するよう強制しません。 – payo

+0

あなたはそうです。その場合、良いコードを書くためにプログラマが責任を負います。 – FishBasketGordo

2

個人的に、私は決して生産コードに到達できないコードを残すことはありません。テストのためには問題ありませんが、テストのままにしないでください。

あなたはこれを行うことはありませんか?

public void MyMethodThatThrows() 
{ 
    throw new Exception(); 
    return; // unneeded 
} 

だから、なぜbreakを保持しますか?

+0

私はこの井戸の最初の部分を理解しており、それは良い点です。しかし、この例は多少ストローマンですが、ボイドの中にリターンを入れないのですが、私はスイッチの中にブレークを入れてしまいます。もちろん、この質問は、スイッチのリターンではなく、休憩に関するものです。なぜなら、私は1つの出口種の人だからです。 –

+0

@TimLehner、ハ、良い点。私の例は基本的に問題を誇張することでした。 –

7

私はswitchに「隠す」ことはできません。私はできるだけ早くArgumentExceptionsを投げます。それは副作用を避け、さらに透過的です。ことを、私は私のプロジェクトのソースはとてもクールとトラブルレスなあ

public void SomeMethod(int someInt) 
{ 
    if (someInt == 3) 
     throw new ArgumentException("someInt must not be 3", "someInt"); 

    switch (someInt) 
    { 
     // ... 
    } 
} 
+1

優れたポイントと素晴らしいコードの匂い。 –

0

誰かがそれが例えば3

ですがsomeIntを使用していくつかの点でスイッチの前にコードを追加することができます私は防衛プログラミングのそのような小さなケースについて考える必要があります:)

私は、ソフトウェア開発にはCOMとInterop、セキュリティ/アクセス許可と認証、証明書、so-oo多くの落とし穴があることを意味する... gosh 、方法を教えてくれない私は足での射撃から自分を守るために書く必要があります。

これは重複しているため、「ケース」がbreakまたはreturnで終わっていることを知っている仲間にとって紛らわしく、このことを知らないフェローにとって明らかになるはずです。

+0

本当に、これは人生で誰の最大の問題ではありません。今や、帰ってきて終わりのケースは間違いなく議論の対象となっています... –

0

MSDN C# Referenceは、「最後のブロックがcase文であるかdefault文であるかを含めて、各caseブロックの後に改行などのジャンプ文が必要です。

「スロー」は「ジャンプ文」を構成しませんか?私はそれがそうだと思う。したがって、「中断」は必要ではなく、「到達できない」問題は解消されます。 :)

+0

OPは、「休憩」は必要ではないことを認めましたが、防衛的にそれらを残すことを検討しています。あなたが例外を投げる以外の何かをすることにしたなら、どうなるか考えてみてください。 – jerry

関連する問題