【问题标题】:Java: Appropriate exception for initialization errorJava:初始化错误的适当异常
【发布时间】:2012-03-29 21:09:18
【问题描述】:

当静态工厂方法无法初始化新对象时,我应该抛出哪个异常?我更喜欢提出一个有意义的异常而不是返回null

【问题讨论】:

  • 这将取决于导致失败本身的原因,即网络问题、文件读取失败等。
  • 你的意思是我应该抛出初始化期间遇到的任何异常?
  • 不一定,但你的例外应该有意义地告诉你出了什么问题,而不仅仅是 something 出了问题。

标签: java exception error-handling initialization


【解决方案1】:

如果你因为数据不足而在 Factory 中抛出异常,我喜欢抛出 IllegalStateException,其描述类似于“无法构造 X,未设置 Y”。

如果您由于数据冲突而在工厂中抛出异常,我喜欢抛出一个 IllegalStateException 的描述类似于“无法构造 X,Y 与 Z 冲突”。

如果您由于错误(或无意义的)值而在工厂中引发异常,我喜欢使用类似于“Y 不能是 A”的描述来引发 IllegalArgumentException

如果您由于缺少值而在 Factory 中引发异常,我喜欢使用类似于“Y 不能为空”的描述来引发 IllegalArgumentException

最后一个偏好取决于一些争论。有人建议最好扔一个NullPointerException;就我而言,我们不惜一切代价避免它们,因为许多客户倾向于不阅读异常消息(并假设 NullPointerException 意味着编码错误)。

在任何情况下,您都应该提供一个好的、具体的信息来说明引发异常的原因,以减轻您在几个月后看到该异常引发的未来支持成本。

【讨论】:

    【解决方案2】:

    是的,问题的原因是您最好的选择。如果参数不正确,可以抛出IllegalArgumentException,如果某个文件不存在,可以抛出FileNotFoundException,如果工厂没有正确初始化,可以抛出IllegalStateException,等等……

    但是,创建自己的异常很容易。只需将您的类声明为extends Exception 并添加委托构造函数。如果你扩展 Exception,那么可以抛出它的方法必须用throws 声明。如果你不想这样,你可以扩展 RuntimeException,那些不需要声明。

    【讨论】:

      【解决方案3】:

      理想情况下,您希望扩展 Exception 并制作自己的 IntializatonException

      【讨论】:

        【解决方案4】:

        这样的东西可能应该只是一个断言,但如果事实上这有可能失败,那么对你有意义的自定义异常将是我的选择。

        【讨论】:

          【解决方案5】:

          您可以通过扩展异常类来创建自己的异常

          【讨论】:

          • 这种情况没有内置异常吗?这是很常见的情况。
          • 我几乎不会把抛出异常的构造函数称为常见场景
          • 有很多例外,但如果需要显示自定义消息,拥有自己的更灵活
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-01
          • 1970-01-01
          • 2015-12-23
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多