代码之家  ›  专栏  ›  技术社区  ›  Sruly

我的自定义Exceptions应该继承与它们类似的异常,还是只从exception继承?

  •  10
  • Sruly  · 技术社区  · 17 年前

    我正在我的应用程序中创建一些自定义异常。

    10 回复  |  直到 17 年前
        1
  •  11
  •   Lucero    17 年前

    由于继承用于指定要捕获哪些异常,因此在做出决定时,您应该首先尊重这一点。

    想想携带额外信息的IOException,或者ArgumentOutOfRangeException或ArgumentNullException以外的ArgumentException。

        2
  •  7
  •   AllenG    17 年前

    假设你真的需要一个自定义异常,我会像你正在寻找的那样从exception继承,而不仅仅是从exception继承。

    例如,如何 throw new IntOutOfProperRangeException(); 明显不同于 throw new ArgumentOutOfRangeException("The int value was too large?");

        3
  •  4
  •   Eric Schneider    17 年前

    我认为创建一个新的Exception类型总是更安全的。如果你需要改变它的处理方式,那么更容易找到你正在或可能正在处理它的情况。找到MyException比找到ArgumentOutOfRangeException的具体情况要容易得多。您似乎可以在异常中提供一些额外的信息,创建异常并不需要太多的工作。

    此外,我倾向于继承像MyBaseException这样的基础应用程序类,并确保为异常添加XML注释。

        4
  •  2
  •   BFree    17 年前

    我只是好奇,你为什么不使用已经存在的例外呢?听起来这些例外正是你需要的,你为什么反对使用它们?

        5
  •  2
  •   AnthonyWJones    17 年前

    就我个人而言,如果我有一个索引器,并且索引值超出范围,那么我只会抛出现有的IndexOutOfRangeException,我不会费心继承它。

    如果你只谈论类似但不完全相同的异常,那么看看框架中提供的模式。这似乎没有意义,继承描述了一种“is-a”关系。

        6
  •  1
  •   Aaron Daniels    17 年前

    如果你不需要向异常添加任何额外的数据,那么我就使用原生数据。NET异常,如IndexOutOfRangeException。

    然而,如果你需要将一些你无法用IndexOutOfRangeException原生完成的异常与你的异常相关联,那么我会继承它。这里的好处是,你可以捕获新的自定义异常类型或IndexOutOfRangeException。当然,如果你捕获了基类型,你就不会有额外的属性等等。

        7
  •  1
  •   Samuel Carrijo    17 年前

    依我之见,从另一个异常继承没有问题。这使这一例外的目的更加明确。但请确保适用于ParentException的所有内容也适用于您创建的ChildException。否则,你可能会得到 "Square extends Rectangle" problem ...

        8
  •  0
  •   ATorras    17 年前

    我几乎总是使用IllegalArgumentException(Null和/或超出范围的值)和IllegalStateException来处理比IOException、SQLException、Null更具体的任何事情。..

        9
  •  0
  •   John Cuckaroo    17 年前

    我认为这一切都取决于你是否想将ArgumentNotInPersitableState异常作为ArgumentOutOfRange进行捕获。如果会有这样的catch块(或者如果你正在编写一个框架,它可能会被其他人使用),那么是的,你应该继承相关的异常类型。

        10
  •  0
  •   RA.    17 年前

    如果只使用通用异常,则永远无法捕获应用程序自定义的特定异常。如果你只是使用

    try 
    {
    }
    catch (Exception ex)
    {
    }
    

    您将捕获每个异常,而无法过滤特定错误。

    这也允许我向用户记录方法调用将抛出他们需要处理的特定于应用程序的异常。

    如果继承Exception类,请确保在基类中实现具有消息、消息+内部异常和序列化异常的构造函数。

    这是我举的一个例子。

    /// <summary>
    /// Drive error exception class. Thrown when a drive selection error has occured.
    /// </summary>
    [Serializable]
    public class DriveException : SystemException
    {
        /// <summary>
        /// Default constructor.
        /// </summary>
        public DriveException()
        {
        }
        /// <summary>
        /// Constructor used with a message.
        /// </summary>
        /// <param name="message">String message of exception.</param>
        public DriveException(string message)
            : base(message)
        {
        }
        /// <summary>
        /// Constructor used with a message and an inner exception.
        /// </summary>
        /// <param name="message">String message of exception.</param>
        /// <param name="inner">Reference to inner exception.</param>
        public DriveException(string message, Exception inner)
            : base(message, inner)
        {
        }
        /// <summary>
        /// Constructor used in serializing the data.
        /// </summary>
        /// <param name="info">Data stored to serialize/de-serialize</param>
        /// <param name="context">Defines the source/destinantion of the straeam.</param>
        public DriveException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
    }