提供给Google Guava的Preconditions.*方法的正确错误信息是什么?

Bri*_*ris 12 java exception preconditions guava

例如,当使用Preconditions.checkArgument时,错误消息是否应该反映通过案例或有问题的检查失败的情况?

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

void doStuff(int a, int b) {
  checkArgument(a == b, "a == b");
  // OR
  checkArgument(a == b, "a != b");
}
Run Code Online (Sandbox Code Playgroud)

pol*_*nts 21

对于前置条件检查,在异常详细消息中声明要求比仅仅陈述事实更具信息性.它还可以更自然地阅读代码:

文档提供以下示例:

这允许诸如的构造

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }
Run Code Online (Sandbox Code Playgroud)

被更紧凑的替换

 checkArgument(count > 0, "must be positive: %s", count);
Run Code Online (Sandbox Code Playgroud)

有两点值得注意:

  • 这个例子清楚地说明了要求,而不是事实
    • " 东西必须是正确的 ",而不是" 东西错误的 "
  • 通过反转检查的条件,整个构造更自然地读取

在该示例之后,更好的消息将是:

checkArgument(a == b, "a must be equal to b"); // natural!
Run Code Online (Sandbox Code Playgroud)

您甚至可以更进一步捕获异常消息中的值ab(请参阅Effective Java 2nd Edition,Item 63:Include failure capture information in detailed messages):

checkArgument(a == b, "a must be equal to b; instead %s != %s", a, b);
Run Code Online (Sandbox Code Playgroud)

说明事实的替代方法在代码中不太自然:

checkArgument(a == b, "a != b");              // awkward!
checkArgument(a == b, "a is not equal to b"); // awkward!
Run Code Online (Sandbox Code Playgroud)

注意在Java代码中读取一个布尔表达式,后面跟一个与该表达式相矛盾的字符串是多么的尴尬.

陈述事实的另一个缺点是,对于复杂的前提条件,它可能信息量较少,因为用户可能已经知道了这一事实,但不知道违反的实际要求是什么.

相关问题