10

我在数据访问对象中有一个 Java 方法。这个非常简单的方法将两个整数值插入数据库。

public void saveHourMin(int hour, int min) throws SQLException{
psInsert.setInt(1, hour);
psInsert.setInt(2, min);
psInsert.executeUpdate();
}

这个方法,或者一般来说,任何 DAO 方法,应该在抛出 SQLException 时抛出异常,还是应该捕获并记录异常,然后通过返回码通知用户?哪个是使用 Spring 的应用程序的正确方法?

4

3 回答 3

6

您不能指望调用者始终检查返回码,最好抛出异常。

如果你抛出 SQLException 那么这将是一团糟,你可能最终会得到更高的层,或者在每个方法上添加“抛出异常”,或者只是吃异常。这些选择中的任何一个都不好。

Spring 的做法是提供一个异常转换器,接收原始 SQLException 并抛出 RuntimeException 的子类,该子类包括原始 SQLException 作为原因,并尝试提供尽可能多的有关错误的信息,包括使用供应商错误代码决定抛出哪个特定的子类。如果您使用 Spring 的任何 jdbcTemplates,那么您将获得异常转换功能,因此您不需要在数据访问对象中包含任何异常捕获或抛出。

如果不想使用 Spring,可以在 DAO 中捕获 SQLException 并抛出 RuntimeException,包括原始 SQLException 作为原因。对于大多数 SQLException,您无能为力,您只想快速失败并记录异常。

于 2013-03-05T20:30:50.227 回答
1

我会说不。捕获 SQLException,然后抛出 RuntimeException 或一个 if 后代。您不想让数据访问异常污染您的应用程序。例如,您不应该在 GUI 层中捕获 SQLExceptions。我也不会基于返回码构建应用程序。

通过抛出 RuntimeException 您也不会强迫调用者捕捉它。

于 2013-03-05T20:21:09.290 回答
1

我将创建一个名为 DAOException 的新异常,它不是 RuntimeException,并强制该方法的用户处理此类异常,并可能将枚举作为描述异常的 DAOException 的成员(可能在内部添加实际异常作为内部异常)。

所以抛出的异常可能如下所示:

new DAOException(DAOException.TYPE.SQLE, e)

并且方法 saveHourMin 抛出 DAOException。

这样,如果你遇到各种问题,都属于同一种异常,你不必处理不同的异常。

我建议使用一般异常而不是运行时的原因是因为我不希望它是可选的来处理异常。调用此方法的人必须意识到可能会发生此类问题并提供相关处理(即使这意味着抛出新的 RuntimeException,上帝保佑,但现在由他们决定,这是他们的决定)。作为一般的经验法则,我会避免使用 RuntimeExceptions,因为它们使执行路径不清楚(“有人可能会在执行路径的某个地方捕捉到它,否则它会杀死应用程序,所以可以放手”听起来不对我好)。

于 2013-03-05T20:35:59.713 回答