3

假设我们有一个方法changeUserName(Long id,String newName)调用存储库findUser(Long id)来查找正确的用户实体,然后更改其名称。何时返回 null
是否合适?或者我应该抛出一个自定义(extends AppException extends RuntimeException) 吗?IllegalArgmentExceptionfindUser
UserNotExistException


更新:

  • RuntimeException
    @nachokk @JunedAhsan 其实我是故意让所有的异常unchecked,因为我认为这种方式使客户端代码干净,易于调试,更安全。至于那些“未处理”的,我会将它们全部放在图层的顶部,从而避免在 UI 上显示它们。
    这是因为许多客户端捕获checked exceptions然后忽略它,并且在某些情况下他们不知道如何处理它。这是一个隐患。

  • 澄清:
    对不起我的英语不好。我的意思是如果changeUserName应该抛出一个IllegalArgumentException,而不是findUser方法。还有一个问题:如何 illegal argument 区分business rule violation

4

3 回答 3

2

你应该使用UserNotExistException. 这个名字非常清楚地说明了正在发生的事情。在我看来,你应该避免返回null,但如果你这样做,你必须记录它。

更新

我在想,正如@JunedAhsan 所建议的那样,UserNotExistException可能会更好CheckedException(从 Exception 而不是 RuntimeException 扩展)。

从此链接:未经检查的例外:争议

如果可以合理地期望客户端从异常中恢复,则使其成为受检异常。如果客户端无法从异常中恢复,请将其设为未经检查的异常。

/**
* @return User found or throw UserNotExistException if is not found
*/
public User findUser(Long id) throws UserNotExistException{
    //some code
    User user = giveMeUserForSomePlace();
    if(user == null){
        throw new UserNotExistException();
    }  
    return user;   
}
于 2013-08-11T03:56:52.257 回答
1

这取决于您如何处理异常。

如果您只使用 e.getMessage() 显示错误报告并且您不关心重复的字符串附加代码,则 IllegalArgumentException 是可以的。

这是我通过使用自定义异常发现的一些优势:

1.减少重复代码:

假设 changeUserName 肯定不是您加载用户的唯一情况,所以每次调用 repository.findUser(Long id) 时都会发生下面的这段代码片段

if (user == null) {
    throw new IllegalArgumentException("No such user found with given id["+ userId +"]");
}

另一方面,临时异常更方便:

if (user == null) {
     throw new UserNotExistException(userId);
}

public class UserNotExistException extends RuntimeException {
     public UserNotExistException(Long id) {
         super("No such user found with given id["+ id +"]");
     }
}

2. 你需要更多的例外支持:

也许您需要返回状态码或类似的东西。自定义异常层次结构可能会有所帮助:

有关详细信息,请参阅此答案

于 2013-08-11T05:31:56.453 回答
0

我也建议使用UserNotExistException,但不同的是,它不是未经检查的异常(通过扩展RuntimeException),而是使其成为检查异常(Exception 如果AppException尚未这样做,则扩展)。

这将确保调用者changeUserName处理UserNotExistException异常并使代码更加健壮。

于 2013-08-11T05:31:26.983 回答