例如,当使用Preconditions.checkArgument时,错误消息是否应该反射(reflect)所检查支票的通过情况或失败情况?

import static com.google.common.base.Preconditions.*;

void doStuff(int a, int b) {
  checkArgument(a == b, "a == b");
  // OR
  checkArgument(a == b, "a != b");
}

最佳答案

对于前提条件检查,在异常详细信息中说明需求比仅说明事实更具信息性。这也导致更自然地阅读代码:

documentation提供以下示例:



有两点值得注意:

  • 该示例清楚地说明了需求,而不是事实
  • “某事一定是对的”,而不是“某事是错的”
  • 通过反转检查的条件,整个结构更自然地读取

  • 在该示例之后,更好的消息将是:
    checkArgument(a == b, "a must be equal to b"); // natural!
    

    您甚至可以更进一步,并在异常消息中捕获ab的值(请参阅有效的Java 2nd Edition,项目63:在详细消息中包括故障捕获信息):
    checkArgument(a == b, "a must be equal to b; instead %s != %s", a, b);
    

    陈述事实的替代方法不太容易在代码中读取:
    checkArgument(a == b, "a != b");              // awkward!
    checkArgument(a == b, "a is not equal to b"); // awkward!
    

    请注意,用Java代码读取一个 boolean 表达式,然后跟一个与该表达式矛盾的字符串来读取是多么尴尬。

    陈述事实的另一个缺点是,对于复杂的前提条件,它的信息量可能较少,因为用户可能已经知道该事实,但是并没有违反实际要求。

    相关问题
  • Null check error message as “is null” or “was null”
  • 09-30 15:35
    查看更多