代码之家  ›  专栏  ›  技术社区  ›  Jason Young

基于消息捕获异常是否合理?

  •  2
  • Jason Young  · 技术社区  · 15 年前

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

    10 回复  |  直到 15 年前
        1
  •  4
  •   Jon Skeet    15 年前

    你是添加项目的人吗?如果是这样,那么首先编写代码以避免这种情况发生。

    这应该是非常罕见的处理一个问题 ArgumentException ,及 难以置信地

    编辑:而不是调用 ToDictionary ToLookup . 然后可以检查具有多个条目的任何结果。

    或者,编写自己版本的

        2
  •  2
  •   user153498 user153498    15 年前

    您可以创建自己的从 Exception

    例如:

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

    但是,如果它是来自第三方组件的异常,除了 ContainsKey 方法。一 ArgumentException String 提供关于它的信息。

        3
  •  2
  •   John Saunders Tony    15 年前

    永远不要使用 Message

        4
  •  2
  •   Aaronaught    15 年前

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

    这在Enumerable.ToDictionary中提到 documentation .

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

        5
  •  1
  •   David R    15 年前

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

        6
  •  1
  •   Fox Mulder    15 年前

        7
  •  1
  •   Mike LaSpina    15 年前

    不根据消息筛选异常的另一个原因是消息可能已本地化!对于.NET framework组件引发的异常尤其如此。

        8
  •  0
  •   Oded    15 年前

    我同意这味道,但看起来你别无选择。。。

        9
  •  0
  •   recursive    15 年前

    try {
        // your code
    } 
    catch (ArgumentException ex) {
        if (ex.Message != "An item with the same key has already been added") throw;
    
        // handle your case
    }
    
        10
  •  0
  •   user3782818    15 年前

    如果这个异常在第三方库中,并且肯定没有办法生成您自己的异常,那么我将继续查看异常的“StackTrace”或“TargetSite”属性,因为它们都为您提供了完全相同的类名,不能通过切换区域设置或类似的方式来更改。