我希望使用特定消息优雅地处理特定异常。不幸的是,它只是一个ArgumentException,并不是我想要的具体。在这种情况下,消息是“已添加具有相同密钥的项目”。这是一个例外情况,但我想处理它,以便我可以将其转换为特定的例外或通知用户非技术术语。
编写代码以查找该消息似乎是一个坏主意,但我还能做些什么呢?
答案 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'属性,因为他们都给出了你完全相同的类名,不能通过切换语言环境或类似的东西来改变。