【问题标题】:Organizing Custom Exceptions in C#在 C# 中组织自定义异常
【发布时间】:2012-10-08 21:52:38
【问题描述】:

我正在创建一个 C# 应用程序,并尝试在适当的时候利用自定义异常。我在这里查看了其他问题和 MSDN 设计指南,但没有遇到任何像我在这里想知道的那样具体的问题。

组织自定义异常的最佳做法是什么?

例如,我有一个类Disk 会抛出一个InvalidDiskExceptionDisk 是唯一抛出此异常的类。

目前,我在 Disk.cs 文件中嵌套了如下异常:

Disk.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OrganizingExceptionsInCSharp
{
    class Disk
    {
        [Serializable]
        public class InvalidDiskException : Exception
        {
            public InvalidDiskException() { }
            public InvalidDiskException(string message) : base(message) { }
            public InvalidDiskException(string message, Exception innerException) : base(message, innerException) { }
        }

        //
        // Code that throws the exception.
        //
    }
}

是否应该将异常定义在与 Disk 相同的级别(即不嵌套在其中)?异常是否应该嵌套在磁盘中但保留它自己的部分文件?可能还有其他更好的选择吗?如果还有其他我没有想到的注意事项,请告诉我。

【问题讨论】:

  • 我个人认为嵌套类没有任何意义,除非您将嵌套类设为私有。如果它们是公开的,则嵌套除了使外部引用更加冗长之外没有其他用途。我通常会在它自己的文件中定义每个类,如果只是因为它可以更容易地浏览应用程序的结构。除此之外,我正在查看这段代码并想知道 InvalidDiskException 给了我什么 IOException 没有?除非您要专门捕获此错误,否则在这里创建自定义异常有什么意义?
  • 我和詹姆斯在一起。对我来说,嵌套类是私有类,它们仅在父类中用于单一目的(使父类更清洁)。通常,我们将异常放置在给定项目中它们自己的文件夹中,但是命名空间与通常引发异常的位置相同。
  • James,我正在嵌套异常以提供上下文,即此类是唯一将使用它的类,即使它是公共的。无效磁盘是指上面没有特定文件的磁盘。所以这是 InvalidDiskException 将被提出的时候。它在其他地方专门处理,只是该代码在这里似乎不相关。
  • @KyleTolle 如果因为特定文件不存在而抛出它,则可以使用System.IO.FileNotFoundException
  • Simon,所以您的文件夹结构(至少对于例外情况)与命名空间不匹配,对吗?我可以看到将所有异常放在一个地方的好处,然后进一步让它们仍然适当地命名空间。不过,这似乎与让命名空间与文件夹结构相匹配的做法背道而驰,对吧?我猜你发现它比没有更有益?

标签: c# custom-exceptions


【解决方案1】:

我会在 {MyNamespace}.Exceptions 中定义我的自定义异常

【讨论】:

    【解决方案2】:

    恕我直言,自定义异常应该在它们自己的独立程序集中,原因很简单:如果您最终将它们抛出进程/机器边界,则所涉及的每个进程都可能会遇到问题(因此会遇到另一个异常),如果他们不这样做'对自定义异常有共同的理解。

    【讨论】:

    • 不知道为什么在这里不加评论就投反对票——但在您描述的上下文中,并非所有涉及的流程都需要在同一组程序集中工作,无论异常是否在他们自己的大会?但是,如果您说异常可以独立于系统的其余部分,并且有独立部署它们的情况......?
    【解决方案3】:

    我建议为每个自定义异常创建一个文件/类,并将这些文件/类放在名为 CustomException 的项目子文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 2016-01-15
      • 2017-01-05
      • 2017-06-04
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多