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 说最后一个 catch 块是多余的。我无法理解,为什么?!这是否意味着没有机会到达最后一个 catch 块?

4

4 回答 4

6

这是多余的,因为您在最后一次捕获中没有做任何事情。 throw;是通常会发生的事情。

于 2012-10-12T20:56:08.360 回答
5

这是因为你没有做任何例外的事情。

你只是“重新扔”它。

于 2012-10-12T20:56:13.173 回答
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 回答