我正在处理应该处理某些用户命令的IRC机器人,例如我们可以使用!login <username> <password>
。有时,用户会忘记输入密码,因此他们可能会使用!login myUser hunter2
而不是发送!login myUser
。在这种情况下,应该回复用户并显示错误消息。实际处理命令handleCommand
的方法始终由另一个方法wrapperMethod
包装。我应该使用以下哪种方法来处理用户错误:handleCommand
只是向用户发送有关发生的事情并退出自身的消息,或者是否应该使用错误消息抛出异常并让wrapperMethod
执行其余操作? (String[] command
是没有!
的原始命令,并按空格分隔,因此!login myUser hunter2
将变为{"login", "myUser", "hunter2"}
)
使用例外:
public void wrapperMethod(Object sender, Object receiver, String[] command) {
try {
handleCommand(sender, receiver, command);
catch(CommandExecutionException e) {
receiver.sendTo(sender, e.getMessage());
}
}
private void handleCommand(Object sender, Object receiver, String[] command) {
if(command.length != 3)
throw new CommandExecutionException("Things went wrong");
//Do things
}
不使用例外:
public void wrapperMethod(Object sender, Object receiver, String[] command) {
handleCommand(sender, receiver, command);
}
private void handleCommand(Object sender, Object receiver, String[] command)
if(command.length != 3) {
receiver.sendTo(sender, "Things went wrong");
return;
}
//Do things
}
我应该选择哪种类型,为什么?现在,我想考虑使用例外只是因为我可以保存几行我真正不需要的代码。检测到用户错误时,handleCommand
始终立即停止。还有handleCommand
返回Optional<Error>
或类似的东西的可能性,但这看起来真的很可疑。
答案 0 :(得分:1)
例外 昂贵 。强烈建议不要将它们用作流量控制。这也意味着您的代码可能会突然完成,并使调试或读取变得更加困难。
我会采用不同的路线:使用Hibernate Validators。它们在您的代码中设置或建立起来并不困难,使用它们意味着在您尝试操作之前,您的输入已经过验证。它还使您的验证逻辑和实际业务逻辑分开。
如果您不想采用这种方式,我会鼓励使用后一种方法 - 但是,我会使用else
方法而不是return
来使用void
。
答案 1 :(得分:1)
我更喜欢带异常的选项,因为它将正常处理与错误处理分开。
在第二个选项方法中, handleCommand 负责两者。
第一个选项在Single responsibility principle之后:方法 handleCommand 处理正确的流量,如果出现问题则抛出异常并允许其他人关心此问题。
此外,假设在
部分内//做事
你发现其他错误。如果使用异常,则可以保持一致且干净的模式,任何错误都会触发异常,并且捕获异常的人会正确处理。
不要担心异常是昂贵的;飞机比自行车贵,但如果你去巴厘岛度假,使用相当平面而不是自行车(不适用于巴厘岛公民:))。例外是针对例外设计的,只要您不在常规处理中使用它们,就可以了。