Java抛出错误的异常

Java抛出错误的异常,java,spring-boot,exception,Java,Spring Boot,Exception,我已经创建了两个自定义异常来处理创建新用户和将新用户持久化到数据库的问题。电子邮件用户名是唯一ID,因此如果电子邮件重复,则应引发异常,因为唯一ID已存在。 我也在做密码确认匹配。此确认匹配还将引发密码不匹配的自定义异常。但是,当我将所有内容放在一起并进行测试时,如果密码确认失败,则抛出用户名已存在异常,而不是密码不匹配异常,这两个部分相互独立地正常工作。为什么? 我尝试过重新排序代码,但这似乎并不重要。我还尝试了if/else而不是just if,但得到了相同的结果 //Use

我已经创建了两个自定义异常来处理创建新用户和将新用户持久化到数据库的问题。电子邮件用户名是唯一ID,因此如果电子邮件重复,则应引发异常,因为唯一ID已存在。 我也在做密码确认匹配。此确认匹配还将引发密码不匹配的自定义异常。但是,当我将所有内容放在一起并进行测试时,如果密码确认失败,则抛出用户名已存在异常,而不是密码不匹配异常,这两个部分相互独立地正常工作。为什么?

我尝试过重新排序代码,但这似乎并不重要。我还尝试了if/else而不是just if,但得到了相同的结果

        //Username(email) must be unique
        try {
            //password and confirm password must match
            if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
                throw new PasswordMatchException("password and confirm password does not match");
            } 
                //if passwords match - persist to DB
                newGcUser.setPassword(bCryptPasswordEncoder.encode(newGcUser.getPassword()));
                //Do NOT persist or show the confirm Password
                newGcUser.setConfirmPassword("");
                //set user
                newGcUser.setName(newGcUser.getUsername());
                return userRepository.save(newGcUser);

        } catch (Exception e) {
            throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
        }

    } 
我用邮递员来测试。 如果我测试一封我知道没有注册的电子邮件,并且密码不匹配,我会收到UsernameAreadyExistsException消息,而不是PasswordMatchException,这是因为try{}catch异常e{}块正在捕获你在块中抛出的异常,将异常抛出到try-catch块之外,它应该可以工作:

    // password and confirm password must match
    if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
        throw new PasswordMatchException("password and confirm password does not match");
    }

    // Username(email) must be unique
    try {
        // if passwords match - persist to DB
        newGcUser.setPassword(bCryptPasswordEncoder.encode(newGcUser.getPassword()));
        // Do NOT persist or show the confirm Password
        newGcUser.setConfirmPassword("");
        // set user
        newGcUser.setName(newGcUser.getUsername());
        return userRepository.save(newGcUser);

    } catch (Exception e) {
        throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
    }

或者捕获一个不太通用的异常,例如从userRepository抛出的异常。保存并重试它,那么它将只捕获该异常,而不是所有异常。发生这种情况的原因是PasswordMatchException扩展了异常,而catch块正在捕获该异常并抛出UsernameAReadyExistsException

减少代码以说明我的观点:

try {
     throw new PasswordMatchException();
} catch(Exception e) {
     throw new UsernameAlreadyExistsException();
}
如果不了解代码可能抛出的异常类型,您可能有两种解决方案:

我捕捉到比异常更具体的东西


2将密码检查移到try/catch块之外。

建议分为不同的方法并将其模块化:

private void matchPassword(..newGcUser..) throws PasswordMatchException{
// password and confirm password must match
    if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
        throw new PasswordMatchException("password and confirm password does not match");
    }
}
要持久化的方法应捕获特定异常:

// Username(email) must be unique
try {
    // if passwords match - persist to DB
   ...
    return userRepository.save(newGcUser);

} catch (DataIntegrityViolationException e) {
    throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
}

多亏了这两个答案。我移动了关于try/catch的密码if语句,要求确认密码,现在一切正常