【问题标题】:Should I declare unchecked exceptions in the throws specification?我应该在 throws 规范中声明未经检查的异常吗?
【发布时间】:2014-01-19 05:46:39
【问题描述】:

我知道必须处理或指定已检查的异常,但未检查的异常是可选的。

如果出于某种原因我可以合理地预期方法中会发生未经检查的异常,我应该将其添加到 throws 规范中吗?还是我应该尽可能缩短规范?

【问题讨论】:

  • 我说添加它。源代码是最好的文档。
  • @SotiriosDelimanolis 最好的文档是抛出异常的那一行,而不是它可能这样做的声明性声明。
  • @MarkoTopolnik 我同意,但使用该类的人可能无法访问该源。但是,他们可以访问方法签名。
  • @SotiriosDelimanolis 在这种情况下,他们将无法访问“最佳文档”,对吗? :)
  • 但是@MarkoTopolnik,API 中的声明尽可能接近源代码,并且在 IDE 中也可以直接看到。我不会这样反驳它。也许我什至会更进一步地说,最好的地方实际上是声明而不是实现,因为后者可以更容易地更改,而声明(假设)兼容。不确定我是否对您的陈述解释太多:)

标签: java exception throws


【解决方案1】:

这是一个设计决定。通常你不会那样做。但是,如果您认为代码的用户捕获Exception 至关重要,那么这是一种暗示他这样做的方法。另一种方法是将其添加到文档中,并解释为什么捕获 Exception 很重要。

【讨论】:

    【解决方案2】:

    如果出于某种原因我可以合理地预期方法中会发生未经检查的异常,我应该将其添加到 throws 规范中吗?

    由于未经检查的异常表示编程错误,因此应避免在throws 子句中声明它们。通常,不应尝试捕获这些异常,除非您的程序的最高级别。此规则有一些例外(双关语) - 例如,在生产代码中您应该使用 NumberFormatException

    注意:有时,框架的作者会让他们的基础异常继承RuntimeException(例如HibernateException)。类似的异常也应该被捕获。

    【讨论】:

    • NumberFormatException 除外。当用户输入数字时,应该始终抓住这一点。
    • 好点。另一方面,如果即使用户可以处理异常恰好未选中,那么我可以根据这个推理添加它。对吗?
    • Josh Bloch 同意 Effective Java 中的这个答案:“不要使用 throws 关键字在方法声明中包含未经检查的异常”(2e,第 252 页)。不过,他的理由是鼓励在 throws 子句中声明 HibernateException
    • 从 springframework 中检出 RestTemplate,方法在签名 RestClientException 中声明,这是一个 RuntimeException。
    • 这是大多数人都缺少的异常处理的基本原理。
    【解决方案3】:

    没有必要在 throws-clause 中显式声明,因为它是关于运行时异常的,但您应该在 javadoc 中记录它,以便用户可以看到在什么情况下可能发生此异常以及它的含义。

    【讨论】:

    • 是的,一定要在 javadoc 中记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多