2012-10-12 22 views
3

我正在製作一個庫,以便其他人可以使用,我希望使它成爲防彈(如果這是正確的術語)。在下面的代碼中,我想檢查位於字節數組索引8處的byte。如果庫的用戶提供的字節長度小於9,我想警告用戶。考慮以下代碼:嘗試catch塊中的例外優先級

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塊沒有可能達到?

回答

2

如上所述,這是因爲你只是重新投擲它。 我想補充兩點:

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

我想補充的原始異常

一般來說,我會改變它的話,在函數的開始,我想補充

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

這還要添加一些編譯時檢查(代碼合同),並避免以前已知的異常。

+0

我同意添加內部異常。我沒有使用合同,所以我不能說這個。 – Jim

6

這是多餘的,因爲你在最後一次捕獲中沒有做任何事情。 throw;是通常會發生的事情。

5

這是因爲你沒有做任何異常事情。

你只是「重新投擲」它。

1

它不是一個優先問題。

它是多餘的,因爲只是拋出相同的異常等同於塊不在那裏。