2016-06-15 66 views
2

我有一個名爲ValidIP()的方法,它需要string並且如果字符串是有效的IP地址,則返回true。示例1在try/catch語句後返回true,因爲我不在意在返回值時捕獲異常。示例2在測試字符串並等待try指令中的異常之後直接返回值。這是個人喜好的問題還是一個更正確或更安全/不易崩潰的例子?從try/catch返回值的正確方法

例1

private bool ValidIP(string ipAddress) 
{ 
    try 
    { 
     IPAddress.Parse(ipAddress); 
    } 
    catch 
    { 
     return false; 
    } 
    return true; 
} 

例2

private bool ValidIP(string ipAddress) 
{ 
    try 
    { 
     IPAddress.Parse(ipAddress); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+6

這兩個程序是完全等效的... –

+2

除了點,但私人布爾ValidIP(字符串ipAddress){IPAddress tmp;返回IPAddress.TryParse(ipAddress,out tmp);'是最好的方法。那麼你永遠不必處理投擲和捕捉異常的開銷。 –

回答

4

據我所知,兩種方法都是等價的。然而,要解決這個問題的一種更優雅的方式是使用IPAddress.TryParse方法:

public static bool TryParse(string ipString,out IPAddress address) 

的方法取決於它成功地解析地址返回truefalse。此外,它使用參數out,以便您可以立即使用解析的IP地址。

如果你只關心IP地址是否有效,你可以使用一個dummy IP地址:

private bool ValidIP(string ipAddress) { 
    IPAddress dummy; 
    return IPAddress.TryParse(ipAddress,out dummy); 
} 

另外還要注意的ParseTryParse方法的重要備註:

注那0123B返回true如果它成功地解析輸入, 但這是的不一定意味着生成的IP地址 是有效的。請勿使用此方法驗證IP地址。

+1

我認爲這是最好的解決方案,IPAddress已經提供了TryParse()方法,這正是我嘗試創建的方法。感謝Willem幫助我保持頭腦清醒。 –

2

沒有辦法的聲明return true拋出異常,所以這兩個片段是相同的。如果您正在對您返回的值進行一些計算,但實際上可能會拋出異常,並且您希望拋出異常而導致拋出該異常的方法,而不是返回false,那麼您需要使用後一種方法。