使用例外来解决用户错误

时间:2014-11-08 23:38:20

标签: java

我正在处理应该处理某些用户命令的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>或类似的东西的可能性,但这看起来真的很可疑。

2 个答案:

答案 0 :(得分:1)

例外 昂贵 。强烈建议不要将它们用作流量控制。这也意味着您的代码可能会突然完成,并使调试或读取变得更加困难。

我会采用不同的路线:使用Hibernate Validators。它们在您的代码中设置或建立起来并不困难,使用它们意味着在您尝试操作之前,您的输入已经过验证。它还使您的验证逻辑和实际业务逻辑分开。

如果您不想采用这种方式,我会鼓励使用后一种方法 - 但是,我会使用else方法而不是return来使用void

答案 1 :(得分:1)

我更喜欢带异常的选项,因为它将正常处理与错误处理分开。

在第二个选项方法中, handleCommand 负责两者。

第一个选项在Single responsibility principle之后:方法 handleCommand 处理正确的流量,如果出现问题则抛出异常并允许其他人关心此问题。

此外,假设在

部分内
  

//做事

你发现其他错误。如果使用异常,则可以保持一致且干净的模式,任何错误都会触发异常,并且捕获异常的人会正确处理。

不要担心异常是昂贵的;飞机比自行车贵,但如果你去巴厘岛度假,使用相当平面而不是自行车(不适用于巴厘岛公民:))。例外是针对例外设计的,只要您不在常规处理中使用它们,就可以了。