当没有调用先决条件方法时,要抛出什么异常



我有一个方法getUser,它从数据库中检索用户。该方法要求您验证用户是否确实存在(通过userExists(String username)方法。

如果调用了getUser方法,但用户不存在,我想抛出一个未检查的异常,但在这里哪个异常最合适?我考虑过IllegalArgumentException,但感觉并不完全正确,因为某些输入在某些情况下可能是可以的,但在其他情况下则不然——它们并不是严格意义上的"非法"。有什么建议吗?

对我来说,IllegalArgumentException意味着该参数是非法的,并且总是非法的。我会使用的异常是IllegalStateException,表示检查用户的对象状态无效。

然而,你可能有一个特殊的例外,你可以创建自己的。

public class UsernameNotCheckedException extends IllegalStateException {
    public UsernameNotCheckedException(String message) {
        super(message);
    }
}

这可能会使调试变得更容易。

NumberFormatExceptionIllegalArgumentException的一个子类。如果你试图解析数字12QW4,它会给你一个NumberFormatException,以后你无法将其作为一个有效的参数。即它与任何事物的状态无关。

IllegalStateException的Javadoc声明。

表示某个方法在非法或不适当的时间被调用的信号。换句话说,Java环境或Java应用程序不处于所请求操作的适当状态。

IllegalStateException不是正确的选择。IllegalStateException是指其方法已被调用的对象的状态,即this的状态不正确。在您的情况下,this(即数据库服务器(很好,"不正确"的是用户

IllegalArgumentException是正确的选择-错误的是用户,而不是服务器。

另一个有效的选项是抛出您自己的域特定异常,如UnknownUserException,但如果这种情况"罕见"或意外且不可恢复,则可以使用IllegalArgumentException

我不会抛出任何异常,只是返回null。或者我会抛出一个名为UserDoesNotExistException的函数异常。

以下是我的推理:当用户调用一个方法时,会使用IllegalStateException,该方法在给定对象状态的情况下是被禁止的。在这里,导致异常的不是对象的状态。事实上,数据库中不存在用户。

您可能会争辩说,用户以前应该调用userExists,并且此方法甚至可以使用实例字段记住它已经被调用(使用此参数(,这样getUser甚至可以在不进入数据库的情况下抛出IllegalStateException

但这里的问题是,之前调用userExists可能不会添加任何内容:它将执行一个查询来检查用户是否存在,然后getUser将执行第二个查询,并且不能保证找到用户,因为另一个事务可能已经删除了它

相关内容

最新更新