首页 > 解决方案 > Java抛出错误的异常

问题描述

我创建了 2 个自定义异常来处理创建新用户并将其持久保存到数据库。电子邮件(用户名)是唯一 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.");
        }

    } 

我正在使用 Postman 进行测试。如果我测试一封我知道未注册的电子邮件并且与密码不匹配,我会收到 UsernameAlreadyExistsException 消息而不是 PasswordMatchException

标签: javaspring-bootexception

解决方案


发生这种情况是因为您的try {} catch (Exception e) {}块正在捕获您在块内抛出的异常,将异常抛出到try catch块外并且它应该可以工作 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.save并重新抛出它的异常,然后它只会捕获该异常而不是全部)


推荐阅读