2011-03-14 96 views
4

我想抛出一个运行时异常,以防我的类不变量失效。由于这是一个编程错误(类似于NullPointerException),客户端不应该捕获该异常。抛出一个私人异常是否有意义?

应该将异常类声明为private还是public(或其他)?

class Foo 
{ 
    // ... 

    private static class InvariantsViolated 
    { 
     // ... 
    } 
} 

定制运行时异常和可见性是否有任何指导原则?

回答

3

您可能会考虑使用现有的异常,除非您希望以其他方式捕获此异常。如果预计不会被捕获,我不认为需要定制异常。一些例外,你可以重新使用

  • AssertionError - 对我来说这意味着有一个不可确定的不确定类型的编程错误。
  • IllegalArgumentException - 对我来说,这意味着只有该方法的参数无效。
  • IllegalStateException - 对我来说,这意味着对象的状态(例如值的组合)对此操作无效。

如果您想要自定义异常,可以考虑扩展这些异常,或使用扩展这些异常的异常之一。

+0

我不会扔手动声明AssertionError,但使用断言来检查不变式是件好事。 – atamanroman 2011-03-14 08:30:05

+1

'assert'需要打开才能正常工作。您可能希望此检查始终发生。 – 2011-03-14 08:32:41

+0

事实上,我曾考虑过'IllegalStateException',但其文档中提到“信号表明某个方法在非法或不适当的时间被调用。”事实并非如此。 – fredoverflow 2011-03-14 08:42:16

0

我相信,为了throw什么,该对象必须实现Throwable接口,这意味着它必须是一个要么或ErrorException。由于您不希望客户发现有史以来,您应该使用Error。从Error documentation

一个错误是Throwable的 一个子类,表示严重的问题,一个 合理应用程序不应该试图 赶上。

这样,你可以避免可怕Exception追赶,府一些程序员倾向于使用 - 大多数时候,这些程序员甚至不考虑捕获的Error在所有...

+1

这就是为什么我们在应用中使用'Throwable' catch-alls ;-) – 2011-03-14 08:40:19

相关问题