我有一个方法getUser
,它从数据库中检索用户。该方法要求您验证用户是否确实存在(通过userExists(String username)
方法。
如果调用了getUser
方法,但用户不存在,我想抛出一个未检查的异常,但在这里哪个异常最合适?我考虑过IllegalArgumentException
,但感觉并不完全正确,因为某些输入在某些情况下可能是可以的,但在其他情况下则不然——它们并不是严格意义上的"非法"。有什么建议吗?
对我来说,IllegalArgumentException意味着该参数是非法的,并且总是非法的。我会使用的异常是IllegalStateException,表示检查用户的对象状态无效。
然而,你可能有一个特殊的例外,你可以创建自己的。
public class UsernameNotCheckedException extends IllegalStateException {
public UsernameNotCheckedException(String message) {
super(message);
}
}
这可能会使调试变得更容易。
NumberFormatException
是IllegalArgumentException
的一个子类。如果你试图解析数字12QW4
,它会给你一个NumberFormatException
,以后你无法将其作为一个有效的参数。即它与任何事物的状态无关。
IllegalStateException
的Javadoc声明。
表示某个方法在非法或不适当的时间被调用的信号。换句话说,Java环境或Java应用程序不处于所请求操作的适当状态。
IllegalStateException
不是正确的选择。IllegalStateException
是指其方法已被调用的对象的状态,即this
的状态不正确。在您的情况下,this
(即数据库服务器(很好,"不正确"的是用户。
IllegalArgumentException
是正确的选择-错误的是用户,而不是服务器。
另一个有效的选项是抛出您自己的域特定异常,如UnknownUserException
,但如果这种情况"罕见"或意外且不可恢复,则可以使用IllegalArgumentException
我不会抛出任何异常,只是返回null
。或者我会抛出一个名为UserDoesNotExistException
的函数异常。
以下是我的推理:当用户调用一个方法时,会使用IllegalStateException
,该方法在给定对象状态的情况下是被禁止的。在这里,导致异常的不是对象的状态。事实上,数据库中不存在用户。
您可能会争辩说,用户以前应该调用userExists
,并且此方法甚至可以使用实例字段记住它已经被调用(使用此参数(,这样getUser
甚至可以在不进入数据库的情况下抛出IllegalStateException
。
但这里的问题是,之前调用userExists
可能不会添加任何内容:它将执行一个查询来检查用户是否存在,然后getUser
将执行第二个查询,并且不能保证找到用户,因为另一个事务可能已经删除了它