我的自定义异常应该继承自它们的类似异常,还是只继承异常?我在我的应用程序中创建了一些自定义异常。如果我有一个在测试参数状态后抛出的异常,或者如果我有一个在测试int在正确范围内后抛出的异常,我的异常会继承ArgumentException和IndexOutOfRangeException,还是应该继承Exception?由于继承用于指定要捕获的异常,因此您在做出决定时应该尊重这一点。可以想象一个带有附加信息的IOException,或者一个ArgumentOutOfRangeException或ArgumentNullException以外的ArgumentException。假设您真的需要一个自定义异常,我会从异常中继承您最喜欢的异常,而不仅仅是异常。也就是说,我发现在大多数情况下,使用正确的措辞,Exception消息通常足以创建一个全新的异常。例如,如何抛出newIntOutOfProperRangeException();显着不同于thrownewArgumentOutOfRangeException("Theintvaluewastoolarge?");thrownewArgumentOutOfRangeException("整数值太大了?");我认为创建新的异常类型总是更安全。如果您需要更改它的处理方式,将更容易找到您正在或可能正在处理它的情况。查找MyException比查找ArgumentOutOfRangeException的特定情况要容易得多。您似乎能够在异常中提供一些额外的信息,并且创建异常并没有太多工作。此外,我倾向于继承像MyBaseException这样的基础应用程序类,并确保为异常添加XML注释。我只是好奇,你为什么不实际使用已经存在的异常?听起来这些异常正是您所需要的,为什么有人反对使用它们?就个人而言,如果我有一个索引器并且索引值超出范围,那么我只是抛出现有的IndexOutOfRangeException,我不会去继承它的麻烦。如果您只是在谈论相似但不相同的异常,那么请查看框架中提供的模式。看起来这似乎没有意义,继承描述了一种“is-a”关系。如果您不需要向异常添加任何其他数据,那么我只使用本机.NET异常,如IndexOutOfRangeException。但是,如果您需要将某些东西与您的异常联系起来,并且您不能使用IndexOutOfRangeException本机执行此操作,那么我将继承它。这里的好处是您可以捕获新的自定义异常类型或IndexOutOfRangeException。当然,如果你捕获原始类型,就不会有额外的属性等。恕我直言,从另一个异常继承是没有问题的。它使这个异常的目的更加清晰。但是请确保适用于ParentException的所有内容也适用于您创建的ChildException。否则,你最终会遇到“SquareextendsRectangle”问题......我几乎总是使用IllegalArgumentException(空值和/或超出范围的值)和IllegalStateException对于不比IOException,SQLException,Null更具体的任何东西......如果你使用只有通用异常,您永远无法捕获为您的应用程序定制的特定异常。如果您只使用try{}catch(Exceptionex){}您将捕获每个异常而无法过滤特定错误。我创建自定义异常的另一个原因是处理可能由于多种原因而发生的特定于应用程序的异常。这允许抛出自定义异常,但自定义与异常关联的消息。它还为我的特定应用程序提供了另一个级别的错误处理。例如,我有一个适合皮带传动系统的工程应用程序。DLL也可供其他人使用。Ihaveanapplicationexceptionthatisthrownwhenanerroroccursinaselect.此错误可能有多种原因(无效的驱动速度、不正确的马力要求等)。由于失败的原因有很多,自定义应用程序异常允许我提供失败的具体细节。这也允许我向用户说明方法调用将抛出他们需要处理的特定于应用程序的异常。如果继承Exception类,一定要在基类中实现带消息、消息+内部异常和序列化异常的构造函数。这是我的一个例子。//////驱动错误异常类。发生驱动器选择错误时抛出。///[Serializable]publicclassDriveException:ApplicationException{//////默认构造函数。///publicDriveException(){}//////与消息一起使用的构造函数。//////异常的字符串消息。publicDriveException(stringmessage):base(message){}//////与消息和内部异常一起使用的构造函数。//////异常的字符串消息。///引用内部异常。publicDriveException(stringmessage,Exceptioninner):base(message,inner){}//////用于序列化数据的构造函数。//////存储以序列化/反序列化的数据///定义流的源/目的地。publicDriveException(SerializationInfoinfo,StreamingContextcontext):base(info,context){}}我认为这一切都决定你是否要将ArgumentNotInPersitableStateexception作为ArgumentOutOfRange捕获。如果会有这样的catch块(或者你正在写一个框架,别人可能会用到),那么你应该继承相关的异常类型。以上是C#学习教程:我的自定义异常应该继承自它们的同类异常,还是直接继承自异常?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
