为用户显示更好的错误消息
Display better error messages for the user
private boolean relatedCommand(String input) {
// make sure the split afterwards has at least size one
if (input.matches(" .*")) {
return false;
}
final String command = input.split(" ".toString())[0];
return COMMAND_PACKAGE
.keySet()
.stream()
.map(Pattern::toString)
.anyMatch(patternText -> patternText.startsWith(command + " "));
}
public Command getCommand(final String input) throws InvalidInputException {
if (relatedCommand(input)) {
Terminal.printError("test");
throw new InvalidInputException("invalid arguments");
} else {
throw new InvalidInputException("unknown command");
}
...
}
我无法向用户提供更具体的错误消息。例如,我有命令 add track <argument1>
和 add switch <argument1>
。如果用户只是输入 "add",他不应该收到错误消息 "invalid arguments"。相反,它应该是“无效命令:使用添加轨道或添加开关”。因为 relatedCommand() 是一个布尔值。我如何有效地实现它?
正如您所提到的,目前方法 return 是 boolean
,这是一个两种状态的结果。同时求三态结果:
- 命令已知
- 命令未知
- 有几个已知的前缀命令。
对于有关 return 获得正确结果的方式的问题,一种选择是 return 可能命令的集合,它可以表示所需的三种状态:
- 该集合由一个元素组成
- 集合为空
- 该集合包含多个元素。
对原始代码的更改可以像这样:
private Collection<String> relatedCommand(String input) {
// make sure the split afterwards has at least size one
if (input.matches(" .*")) {
return Collections.emptyList();
}
final String command = input.split(" ".toString())[0];
return COMMAND_PACKAGE
.keySet()
.stream()
.map(Pattern::toString)
.filter(patternText -> patternText.startsWith(comman))
.collect(Collectors.toList());
}
public Command getCommand(final String input) throws InvalidInputException {
Collection<String> commands = relatedCommand(input)
if (commands.size() == 1) {
Terminal.printError("test");
throw new InvalidInputException("invalid arguments");
} else if (commands.isEmpty()) {
throw new InvalidInputException("unknown command");
} else {
...
}
}
private boolean relatedCommand(String input) {
// make sure the split afterwards has at least size one
if (input.matches(" .*")) {
return false;
}
final String command = input.split(" ".toString())[0];
return COMMAND_PACKAGE
.keySet()
.stream()
.map(Pattern::toString)
.anyMatch(patternText -> patternText.startsWith(command + " "));
}
public Command getCommand(final String input) throws InvalidInputException {
if (relatedCommand(input)) {
Terminal.printError("test");
throw new InvalidInputException("invalid arguments");
} else {
throw new InvalidInputException("unknown command");
}
...
}
我无法向用户提供更具体的错误消息。例如,我有命令 add track <argument1>
和 add switch <argument1>
。如果用户只是输入 "add",他不应该收到错误消息 "invalid arguments"。相反,它应该是“无效命令:使用添加轨道或添加开关”。因为 relatedCommand() 是一个布尔值。我如何有效地实现它?
正如您所提到的,目前方法 return 是 boolean
,这是一个两种状态的结果。同时求三态结果:
- 命令已知
- 命令未知
- 有几个已知的前缀命令。
对于有关 return 获得正确结果的方式的问题,一种选择是 return 可能命令的集合,它可以表示所需的三种状态:
- 该集合由一个元素组成
- 集合为空
- 该集合包含多个元素。
对原始代码的更改可以像这样:
private Collection<String> relatedCommand(String input) {
// make sure the split afterwards has at least size one
if (input.matches(" .*")) {
return Collections.emptyList();
}
final String command = input.split(" ".toString())[0];
return COMMAND_PACKAGE
.keySet()
.stream()
.map(Pattern::toString)
.filter(patternText -> patternText.startsWith(comman))
.collect(Collectors.toList());
}
public Command getCommand(final String input) throws InvalidInputException {
Collection<String> commands = relatedCommand(input)
if (commands.size() == 1) {
Terminal.printError("test");
throw new InvalidInputException("invalid arguments");
} else if (commands.isEmpty()) {
throw new InvalidInputException("unknown command");
} else {
...
}
}