我们可以在Dao中重新抛出SQLException和ClassNotFound Exceptions而不是重新抛出用户定义的异常吗?

时间:2015-07-04 02:32:24

标签: java exception-handling

public class EmployeeDaoImpl extends JdbcDaoSupportImpl implements EmployeeDao {

    @Override
    public int save(Employee employee) throws EmployeeException {
        String sql = "INSERT INTO EMPLOYEE VALUES(?,?,?)";
        Connection conToUse = null;
        PreparedStatement ps = null;
        int status = 0;
        try {
            conToUse = getConnection();
            ps = conToUse.prepareStatement(sql);
            ps.setInt(1, employee.getEmpNo());
            ps.setString(2, employee.getEmpName());
            ps.setLong(3, employee.getEmpSal());
            status = ps.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            throw new EmployeeException(
                    "%%% Exception occured in EmployeeDao save() %%% " + e);
        } finally {
            DbUtils.closeQuietly(ps);
        }
        return status;
    }

}

在示例代码中,EmployeeDaoImpl类将记录插入数据库。如果有任何异常引发,它会向服务层抛出EmployeeException,这是一个应用程序异常。抛出用户定义的异常有什么需要?在这种情况下我们也可以抛出SQLexceptions,它是否正确?

3 个答案:

答案 0 :(得分:1)

在此实例中无需抛出用户定义的异常。 SQLException应该足够了。

如果Connection对象抛出了您定义的异常,则User Defined Exception会更有意义。

只要您抓住异常并对其执行一些重要事项。

答案 1 :(得分:1)

您不应该抛出ClassNotFoundExceptions,因为DAO不应该负责创建数据库连接。我希望getConnection从某个地方检索一个现有的连接,也许是一个threadlocal,它放在请求的前面。如果它创建一个连接,那么它不会关闭它,这将是不好的。此外,您应该使用连接池(再次导致将可能抛出ClassNotFoundException的代码移动到DAO之外的某个位置)。

对于大多数SQLExceptions,您无法对它们做任何事情,但让它们冒泡,取消当前的工作单元,然后捕获并将其记录在异常处理程序中,因此检查异常是一种烦恼。 Spring在这里做了正确的事情,它将SQLExceptions转换为更有意义但未经检查的DataAccessExceptions,其中不同的子类型用于不同类型的错误。如果您发现自己需要捕获违反RI约束时抛出的异常,那么您将捕获brew install graphicsmagick,而不必担心数据库供应商使用的SQLState,因为Spring已经为您翻译了它。

使用此未经检查的DataAccessException,没有理由再拥有特定于应用程序的包装器异常。

答案 2 :(得分:0)

是的,这些异常可以按原样抛出。 如果你有一个Ui前端或某种类型的客户端,那么将它包装为用户异常并扔掉是有意义的。