从 try/catch 到 return 值的正确方法

Correct way to return value from try/catch

我有一个名为 ValidIP() 的方法,如果字符串是有效的 IP 地址,它会接受 string 和 returns true。示例 1 returns 在 try/catch 语句之后为真,因为我不关心在返回值时捕获异常。示例 2 returns 测试字符串后直接在 try 指令中等待异常时的值。这是个人喜好问题还是一个例子更正确还是 safer/less 容易崩溃?

示例 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;
    }
}

语句return true 无法抛出异常,因此这两个片段是相同的。如果您正在对您 return 的值执行一些实际上可能引发异常的计算,并且您希望在那里抛出异常以导致方法抛出该异常,而不是 returning false,那么您' d 需要使用后一种方法。

据我所知,这两种方法是等效的。然而,解决这个问题的更优雅的方法是使用 IPAddress.TryParse 方法:

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

方法returnstruefalse取决于是否成功解析地址。此外,它还使用了一个 out 参数,以便您可以立即使用解析后的 IP 地址。

如果您只关心 IP 地址是否有效,您可以使用 dummy IP 地址:

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

进一步注意 ParseTryParse 方法的重要说明:

Note that TryParse returns true if it parsed the input successfully, but that this does not necessarily mean that the resulting IP address is a valid one. Do not use this method to validate IP addresses.