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

有理由不使用吗。NET Framework在您自己的代码中定义了异常类?

  •  6
  • Jason Bunting  · 技术社区  · 17 年前

    Enterprise Library 4.1 Exception Handling Application Block 处理多项目应用程序中的日志记录/异常处理。我们有一些自定义异常,并抛出了一些类在中定义的异常。NET框架的标准类库(例如ArgumentException、InvalidOperationException、ArgumentNullException等)。

    今天,我们的队长决定不让我们使用后者,因为。NET框架会抛出这些类型的异常,为了便于使用应用程序块的策略进行过滤,我们应该只使用自定义异常,甚至可以复制。NET标准类库与自定义版本的异常,如 自定义 自定义

    5 回复  |  直到 17 年前
        1
  •  12
  •   Jon Skeet    17 年前

    Ick。我不喜欢的是:

    • 这违反了最小意外原则
    • ArgumentException .

    我建议你让你的团队负责人阅读第60项 Effective Java 2nd edition 是的,它是关于Java而不是C#的,但原则是一样的。

        2
  •  4
  •   Paul Stovell    17 年前

    我赞同Jon Skeet和Kev的回答。我只想补充一点,如果您的异常策略希望将框架级异常与您自己的异常区别对待,请考虑使用异常的堆栈跟踪。

    // Somewhere within a custom exception handler policy
    var frame = new StackTrace(exception).GetFrame(0);
    if (frame.GetMethod().DeclaringType.Namespace.StartsWith("MyNamespace.")) 
    {
        // Handle exceptions from our code
    }
    else 
    {
        // Handle framework-level exceptions
    }
    
        3
  •  4
  •   erlando    12 年前

    Framework Design Guidelines Krzysztof Cwalina和Brad Abrams的书(第一版)建议丢弃在 System 名称空间越具体越好。如果没有很好的匹配,那么抛出一个自定义异常。

    自定义 ArgumentNullException 匹配 System.ArgumentNullException 您可以从堆栈跟踪中确定最终负责人,而不是框架类。

        4
  •  1
  •   Brann    17 年前

    好吧,你的代码和.net基类抛出的异常都应该以相同的方式处理。

    两者都可能是问题的症状 你的 代码,因此两者都不应被忽略或过滤!

        5
  •  0
  •   Matt Ruwe    17 年前

    投掷。当异常正确地描述了您试图暴露的问题类型时,Net异常是可以的(例如,当参数为null时,您应该抛出ArgumentNullException)。如果你发现一种情况没有得到处理。Net框架(例如,您想将6除以3,但您的应用程序不允许这样做),您应该创建一个自定义异常。

    推荐文章