异常处理:用户定义的异常优势

时间:2011-07-15 15:32:25

标签: c# c#-4.0 programming-languages exception-handling

我的异常处理技巧是非常主要的,我总是对我应该使用它们的方式感到困惑,而不是如何/语法。我目前正在使用C#(如果有不同的东西适用于它)。

我的问题是在开发应用程序时创建自己的Exception类有什么好处?与抛出标准异常类异常相比。基本上,您的应用程序中的异常是一种健康的做法。

或者如果不是好处,那么缺点?

7 个答案:

答案 0 :(得分:5)

通过创建自己的例外,您通常可以为最终用户创建更有意义的消息(或更具特定于应用程序的消息类型),同时仍然包装原始消息,以免丢失任何有用的信息。

有一个很棒的book by Bill Wagner涵盖了一些推理,关于何时应该或不应该创建自己的异常,以及一般的异常处理的一些好的做法。这是一个小摘录:

  

您的应用程序将抛出异​​常 - 希望不是经常,但它   会发生的。如果您没有做任何特定的事情,您的申请将会   无论何时发生,都会生成默认的.NET Framework异常   你在核心框架上调用的方法是错误的。提供更多   详细信息将为您和您的用户带来很大帮助   诊断并可能纠正现场错误。你创造   不同的纠正措施是不同的异常类   只有在可能采取不同行动时才有可能。你创造   通过提供所有构造函数来实现全功能的异常类   基本异常类支持。您使用InnerException属性   携带下级生成的所有错误信息   错误条件。

答案 1 :(得分:3)

如果您的应用程序特有的特定类型的问题将在您的应用程序中的更高级别调用唯一的恢复策略,您应该创建自己的异常类型,以便您可以最佳地识别并从这类问题中恢复

如果错误更多是“调用者做错了”,请使用标准异常类。

如果您认为您的图书馆将是长寿且有价值的,那么我会错误地创建您自己的例外类,以便您图书馆的未来用户可以制定自己的恢复策略。

答案 2 :(得分:2)

有时你想为不同类型的错误做不同的事情,例如,如果用户输入了错误的数据,那么它就会使整个应用程序崩溃并通过电子邮件发送给管理员。对于更严重的例如堆栈溢出这样做会有意义。然后,您将根据错误的类型来实现不同的捕获。

答案 3 :(得分:2)

如果某个方法被记录为在某些特定情况下抛出某些特定类别的异常,那么它应该确保在其他情况下,类的任何异常都无法通过它冒出来。在许多情况下,确保这一点的最实际方法可能是创建自定义异常类。

实际上,我认为很多异常层次结构都是无用的,并且建议关注相当少量的异常,几乎所有异常都应该从中得出。

  1. CleanFailureException - 由于某种原因无法执行指示的操作,但未更改任何对象的状态。除了操作失败所隐含的程度之外,没有理由相信任何对象的状态是腐败的。如果TrySomething方法返回False,这应该是DoSomething方法抛出的异常类型。如果失败的操作使一个或多个对象处于部分更改或不一致状态,则在某些情况下可能会包含在更严格的指令中。
  2. StateDisturbedException - 由于某种原因无法完全执行指示的操作,但可能已部分执行。正在执行操作的对象具有符合其自身不变量的状态,但可能符合也可能不符合调用者对其的期望。调用者只有在检查完对象并确保其符合预期(根据需要进行更改)后才会尝试使用该对象。或者,应该在目标对象不再存在的位置捕获此异常,然后将其包装在CleanFailureException中。
  3. TargetStateCorruptException - 无法执行指示的操作,因为正在执行操作的特定对象已损坏,但没有特别的理由可以预期损坏会扩展到对象之外。应该在目标对象不再存在的位置捕获此异常,然后将其包装并替换为CleanFailureException。
  4. ParentStateCorruptException - 无法执行指示的操作,因为目标文档将视为“父”对象的某些对象已损坏。在损坏的父对象不再存在的级别捕获,然后换行“CleanFailureException”。
  5. SystemOnFireException

虽然让异常名称表明出现问题的性质可能会很好,但从捕捉的角度来看,重要的是人们是否可以安全地抓住并恢复。任何异常层次结构都应该关注后者的问题,而不是前者。如果目标是通知出错的地方,那应该在Exception.Message中完成。

答案 4 :(得分:1)

主要好处是添加信息,因此异常更有意义,从而允许捕获特定于您的应用程序的异常。

答案 5 :(得分:1)

抛出异常实际上是比悄然失败更昂贵的操作,例如返回bool。这个问题突出了我的意思:

How much more expensive is an Exception than a return value?

如果你正在编写一些预期其他开发人员将在他们自己的项目中使用的东西,那么肯定的是,一个例外可能对他们有用,以确保他们正确使用你的代码。否则,如果您只是在自己的代码库中使用它,我会确保安静地失败。

答案 6 :(得分:1)

自定义异常运行良好的一个示例是当您希望外部应用程序与项目交互时。

例如,如果您有一个发送电子邮件的小项目,如果您对必须通过电子邮件发送的最小收件人数量有严格限制,则可能会抛出自定义“TooFewRecipients”错误。

自定义异常通常会从System.Exception

继承

请记住,异常只应用于您的项目无法以任何其他方式处理的特殊情况,并且它们应该足以理解,以帮助第三方开发人员理解该问题。 MSDN

有更多信息