3

私は他の人が使えるようにライブラリを作っています。それを防弾にしたいです(それが正しい用語なら)。byte以下のコードでは、バイト配列のインデックス8でチェックしたいと思います。ライブラリのユーザーによって提供されたバイトの長さが9より小さい場合、ユーザーに警告したいと思います。次のコードを検討してください。

    try
    {
        int payloadSizeFromByteArray = Packet[8];
    }
    catch(IndexOutOfRangeException)
    {
        throw new IndexOutOfRangeException("Packet is not valid. Does noe contains byte at index 8 which stores incoming payload length.");
    }
    catch (Exception)
    {
        throw;
    }

ReSharperは、最後のキャッチブロックが冗長であると言います。わからない、なんで?!最後のキャッチブロックに到達する可能性がないということですか?

4

4 に答える 4

6

最後のキャッチでは何もしていないので、冗長です。 throw;通常起こることです。

于 2012-10-12T20:56:08.360 に答える
5

それはあなたが例外を除いて何もしていないからです。

あなたはそれを「再投げ」ているだけです。

于 2012-10-12T20:56:13.173 に答える
2

述べたように、それはあなたがただそれを投げ直しているからです。私は2つのことを追加します:

try { ... }
catch( IndexOutOfBoundsException e )
{
 throw new IndexOutOfBoundsException ("your message", e);
}

元の例外を追加します

通常は変更しますので、関数の先頭に追加します

Contract.Requires( Packet.Length == 8, "your message)" );

これにより、コンパイル時のチェック(コードコントラクト)も追加され、既知の例外が回避されます。

于 2012-10-12T21:01:00.217 に答える
1

それは優先順位の問題ではありません。

同じ例外をスローするだけで、ブロックが存在しないのと同じであるため、冗長です。

于 2012-10-12T20:56:49.373 に答える