尝试并抓住阻止。哪种解决方案更好

时间:2010-08-31 17:33:54

标签: c# design-patterns try-catch

使用它似乎是一种合理的模式:

int.TryParse()

简单如果,而不是:

int.Parse()

在try块内。直到我发现这个样本在MS模式&做法

    /// <summary>
    /// Update a setting value for our application. If the setting does not
    /// exist, then add the setting.
    /// </summary>
    /// <param name="Key"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public bool AddOrUpdateValue(string Key, Object value)
    {
        bool valueChanged = false;
        try
        {
            // if new value is different, set the new value.
            if (isolatedStore[Key] != value)
            {
                isolatedStore[Key] = value;
                valueChanged = true;
            }
        }
        catch (KeyNotFoundException)
        {
            isolatedStore.Add(Key, value);
            valueChanged = true;
        }
        catch (ArgumentException)
        {
            isolatedStore.Add(Key, value);
            valueChanged = true;
        }
        catch (Exception e)
        {
            Debug.WriteLine("Exception while using IsolatedStorageSettings: " + e.ToString());
        }

        return valueChanged;
    }

使用Contains方法是不是更好?另一方面,我已经读过CLR可以优化try-catch到简单的转到。

4 个答案:

答案 0 :(得分:4)

是的,不要为此使用catch块。我不确定你在哪里找到这些代码,但我怀疑它是不可思议的老。 Contains()方法要快得多。另外,请查看字典类的TryGetValue()方法。

答案 1 :(得分:2)

我不确定IsolatedStore应该是什么类型,但如果它是一个Dictionary,那么isolatedStore.TryGetValue(key, out value)将是我首选的检查方式。

对于赋值,isolatedStore[key] = value应该永远不会抛出异常,除非key为null,这对于调用者来说似乎是公平的。从本质上讲,使用索引器本身就是一个添加或更新操作,虽然它不会告诉你以前是否存在该值。

是的,就像int.Parse vs int.TryParse一样,更喜欢为您提供可以处理的响应的方法(如TryGetValue),而不是抛出异常的方法(至少在可恢复的情况下)像这样的情况)。

Ben Voigt提出了一个关于线程安全的重点。使用TryGetValue并使用indexer (isolatedStore[key])而不是.Add()分配值将消除任何异常,但操作仍然不是原子的。

答案 2 :(得分:1)

我运行测试并且TryParse运行速度比Parse快得多,因为如果Parse失败,.NET似乎花了很多时间生成抛出异常,但在TryParse中它只能抛出“假”。 / p>

我不确定任何一个是“更好”,但我的测试表明TryParse似乎更快,我认为TryParse使得代码比许多try / catch块更易读。

编辑:您的代码示例似乎与int解析没有任何关系。

答案 3 :(得分:1)

TryGetValue优于Contains,因为它避免了竞争条件。但是如果你有多个线程访问字典,你将不得不以这种或那种方式处理异常,尽管你可以最小化你支付异常罚款的次数。