根据消息捕获异常是否合理?

时间:2009-12-10 20:09:16

标签: .net exception

我希望使用特定消息优雅地处理特定异常。不幸的是,它只是一个ArgumentException,并不是我想要的具体。在这种情况下,消息是“已添加具有相同密钥的项目”。这是一个例外情况,但我想处理它,以便我可以将其转换为特定的例外或通知用户非技术术语。

编写代码以查找该消息似乎是一个坏主意,但我还能做些什么呢?

10 个答案:

答案 0 :(得分:4)

您是添加该项目的人吗?如果是这样,请编写代码以避免它首先发生。

根据消息处理ArgumentException难以置信很少处理它应该是非常罕见的。基本上只有当你的力量中的一切都失败时,你才应该被迫这样做,例如:它是导致异常的第三方库。 (在这种情况下,你应该联系第三方,告诉他们不要反对他们的想法。)

编辑:请致电ToDictionary,而不是致电ToLookup。然后,您可以检查具有多个条目的任何结果。

或者,编写自己的ToDictionary版本,以正确的方式处理这种情况 - 这非常简单。

答案 1 :(得分:2)

您可以创建自己的异常,该异常派生自Exception类。

例如:

public class KeyExistsException : Exception
{
    // ...
}

但是,如果它是来自第三方组件的例外,除了ContainsKey方法之外,除了检查消息之外,您几乎无能为力。 ArgumentException除了String之外没有任何内容可以提供有关其内容的信息。

答案 2 :(得分:2)

永远不要将Message属性用于显示给人类以外的任何内容。如果他们需要改变信息上的标点符号,或者,上帝保佑,改变拼写或措辞怎么办?

答案 3 :(得分:2)

如果您使用Enumerable.ToDictionary方法构建字典,则ArgumentException始终表示重复键。您根本不需要检查消息,只需将ToDictionary调用放在自己的语句中并捕获ArgumentException。

Enumerable.ToDictionary documentation中提到了这一点。

更一般地说,基于消息本身处理任何异常几乎总是一个坏主意。除其他外,异常消息可能是本地化的,文本将根据操作环境而有所不同。

答案 4 :(得分:1)

您可以在添加新条目之前使用.ContainsKey方法避免异常并检查字典。

答案 5 :(得分:1)

我之前已经这样做了,闪电并没有打击我。爱好。

答案 6 :(得分:1)

不根据消息过滤异常的另一个原因是消息可能已本地化!对于.NET框架组件抛出的异常尤其如此。

答案 7 :(得分:0)

我同意这闻起来,但看起来你没有选择......

答案 8 :(得分:0)

你可能必须这样做。但我真的建议考虑你的设计。这似乎是一个有问题的设计的症状。

try {
    // your code
} 
catch (ArgumentException ex) {
    if (ex.Message != "An item with the same key has already been added") throw;

    // handle your case
}

答案 9 :(得分:0)

如果这个例外是在第三方库中,并且绝对没有办法让你自己的例外,那么我会看看异常的'StackTrace'或'TargetSite'属性,因为他们都给出了你完全相同的类名,不能通过切换语言环境或类似的东西来改变。