提供给Google Guava的前提条件的正确错误消息是什么?*方法?
-
30-09-2019 - |
题
例如使用 先决条件, ,错误消息是否应该反映通过的案例或有关支票的失败情况?
import static com.google.common.base.Preconditions.*;
void doStuff(int a, int b) {
checkArgument(a == b, "a == b");
// OR
checkArgument(a == b, "a != b");
}
解决方案
对于前提检查,说明 要求 在例外细节中,信息比简单地说明事实更具信息性。它还导致更自然地阅读代码:
这 文档 提供以下示例:
这允许诸如
if (count <= 0) { throw new IllegalArgumentException("must be positive: " + count); }
用更紧凑的
checkArgument(count > 0, "must be positive: %s", count);
值得注意的是:
- 该示例显然说明了要求,而不是事实
- "某物 一定是 对“, 代替 ”某物 是 错误的"
- 通过颠倒检查的状况,整个构造更自然地读取
之后,一个更好的消息将是:
checkArgument(a == b, "a must be equal to b"); // natural!
您甚至可以迈出一步并捕获 a
和 b
在异常消息中(请参阅 有效的Java第二版,项目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 Code One Boolean表达式中读取多么尴尬,然后是与表达式相矛盾的字符串。
陈述事实的另一个缺点是,对于复杂的前提条件,它可能不那么信息,因为用户可能已经知道了这一事实,但没有违反的实际要求。
相关问题
其他提示
该文档提供了示例,这些示例可以使用单词而不是符号清楚地清楚:
checkArgument(count > 0, "must be positive: %s", count);
鉴于这些基本上只是在日志中(或调试会话)中的例外消息,因此请尽一切努力对任何看待问题的人或任何阅读代码的人最清楚地表明它。
例如,你 可以 将上述重写为:
checkArgument(count > 0, "count must be positive; was actually %s", count);
就个人而言,我想我会写的
checkArgument(a == b, "a (%s) must equal b (%s)", a, b);
通常(大多数时候)您只能使用checkargument()方法 没有 错误消息参数,即根本不提供错误消息。
要发出一个良好的错误消息,人们需要了解谁将阅读该消息。它不是最终用户;如果前提条件失败,则最有可能指向代码中的错误。文本可能解释了失败的前提条件,但是在大多数情况下,最终用户没有用,应该是程序员的提示。在大多数情况下,如果没有StackTrace和源代码,该消息本身也没有意义。实际上,在大多数情况下,stacktrace和源代码正是程序员需要修复错误的方法,错误消息无济于事。如果前提条件不明显,则旁边的评论是记录它的完美方法。
在没有人真正关心文本的情况下,始终提供错误消息的需求会导致程序员发出无用,明显且不有用的消息,这只会使代码不那么可读。
在某些情况下,当错误消息很有用时,例如,消息可以包含变量的实际值,但是根据我们的经验,这并不是很频繁,在这些情况下,您可以使用该消息。
类似的论点也适用于Junit的断言方法;始终提供错误消息不是一个好主意。
另外,当您在库中使用前提条件而不是最终用户的应用程序时,情况可能会有所不同,因为您不知道如何使用代码。
作为 多摄取剂 指出:
对于先决条件检查,说明例外详细信息中的要求比简单地说明事实更具信息性。
虽然您当然可以使用Guava的先决条件来做到这一点,但 要求API (我撰写的)使您无需任何努力就能实现更好的输出。
番石榴先决条件
String a = "foosball";
String b = "ballroom";
Preconditions.checkArgument(a == b, "a == b");
给你这个:
java.lang.IllegalArgumentException: a == b
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:122)
at Main.main(Main.java:142)
要求API
String a = "foosball";
String b = "ballroom";
requireThat(a, "a").isEqualTo(b, "b")
给你这个:
相同的输入,更好的输出。
(如果您的终端不支持颜色,您将获得文本差异)