【问题标题】:Assertion VS Runtime exception断言 VS 运行时异常
【发布时间】:2013-03-09 15:13:56
【问题描述】:

我正在编写 API,所以我的 API 将被外部模块使用。这是一种我无法弄清楚使用什么断言或java.lang.IllegalArgumentException

的方法
/**
 * Adds translation of information to underlying store for particular language
 * @param languageId The identifier of the language 
 * @param translation The translation provided for the specific language
 * @throws AssertionError if the provided language id is {@code null} or empty
 *         or provided translation is {@code null} or empty
 */
public final void addTranslation(String languageId, String translation){
    assert !(Strings.isNullOrEmpty(languageId));
    assert !(Strings.isNullOrEmpty(translation));

    translations.put(languageId, translation);
}

如果我使用运行时异常,我认为它可能会损害使用此 API 的应用程序的执行。如果我使用断言,那么如果断言标志被禁用,它将损害我的 API。

还尝试阅读类似的帖子When to use an assertion and when to use an exception。但是检测哪种情况是我的有点令人困惑。

是否有严格定义的方式,在哪里使用断言以及在哪里使用运行时异常?

【问题讨论】:

标签: java runtime-error


【解决方案1】:

断言通常是一种可以在生产环境中关闭的开发技术。在 Java、Eiffel、C++ 以及我所知道的所有使用它们的语言中都是如此。

我个人更喜欢运行时异常来执行合同。您无法关闭这些功能。

【讨论】:

  • 是的,我改变了看法,可能是运行时异常是严格的,但执行合同的正确方式。
【解决方案2】:

不要使用断言来验证 API 的输入数据。如果您的 API 使用不正确,只需抛出运行时异常,例如 IllegalArgumentException

【讨论】:

    【解决方案3】:

    断言仅用于测试。对于其他用途,您应该使用异常或 if structores(首选第二种解决方案,因为它比捕获异常快得多)

    【讨论】:

      【解决方案4】:

      断言和异常都不应该用于实现业务逻辑。原因很简单:处理异常非常慢。想象一下,您的代码被非常频繁地调用,然后处理错误的输入,将花费太长时间。只接受一个合约:在调用前检查变量,只传递干净的参数或在方法开始时使用 if 语句检查变量。

      UPD

      断言应该用于检查不应该发生的事情, 而应该使用异常来检查可能 发生。

      Using Assertions in Java

      断言抛出错误而不是异常,因为它们的 目的是让你的程序崩溃。

      Class Error

      错误是 Throwable 的子类,表示存在严重问题 一个合理的应用程序不应该试图捕捉。大多数这样的 错误是异常情况。

      AssertionError 是 Error 的子类

      【讨论】:

      • 检查必须做外部模块而不是我,如果他们不想检查怎么办? :)
      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2023-03-15
      相关资源
      最近更新 更多