使用控制流的异常

时间:2013-08-31 20:02:35

标签: java exception-handling language-agnostic

我已经读过使用控制流的异常并不好,但是如何在不抛出异常的情况下轻松实现以下目标?因此,如果用户输入已在使用的用户名,我想在输入字段旁边显示错误消息。这是我的注册页面支持bean的代码:

public String signUp() {
    User user = new User(username, password, email);

    try {
        if ( userService.save(user) != null ) {
            // ok
        }
        else {
            // not ok
        }
    }
    catch ( UsernameInUseException e ) {
        // notify user that username is already in use
    }
    catch ( EmailInUseException e ) {
        // notify user that email is already in use
    }
    catch ( DataAccessException e ) {
        // notify user about db error
    }

    return "index";
}

我的userService的保存方法:

@Override
@Transactional
public User save(User user) {
    if ( userRepository.findByUsername(user.getUsername()) != null ) {
        LOGGER.debug("Username '{}' is already in use", user.getUsername());
        throw new UsernameInUseException();
    }
    else if ( userRepository.findByEmail(user.getEmail()) != null ) {
        LOGGER.debug("Email '{}' is already in use", user.getEmail());
        throw new EmailInUseException();
    }

    user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt()));
    user.setRegisteredOn(DateTime.now(DateTimeZone.UTC));

    return userRepository.save(user);
}

1 个答案:

答案 0 :(得分:0)

使用例外就像你做的任何事情一样。你可以使用它,但不要过度。

一般情况下,当发生不正确的事情时,您希望抛出异常,但您的程序可能会从另一个模块中恢复。例外有助于将程序(更确切地说是运行时堆栈)置于良好状态,因此您可以对错误做些什么。

使用返回值通常不是一个好主意,通常被视为不太好的设计。

在您的情况下,异常很可能会触发向用户发送的消息,该消息发生在UI中并且应该与注册逻辑本身分开,因此使用异常似乎是合适的。

现在是过度的部分。您可以轻松地执行单个异常,例如SignupException,其中包含出错的原因。您可能不希望最终得到的系统具有比具有高效代码的类更多的异常类。