1

如果我的代码中有异常处理部分,并且它可以触发 4 个 sqlException,那么处理它们的最佳方法是什么,它最能说明发生了什么以及在哪里?我做了一个穷人解决方案(通过使用'exceptionDesc')。

有什么好的做法来处理这种情况吗?(没有制作独特的类和子类)

    try {
        exceptionDesc = "prepareStatement"; 
        statement = connection.prepareStatement(sql);

        exceptionDesc = "statement.set...";
        statement.setDate(1, sqlDate);

        exceptionDesc = "executeUpdate";
        statement.executeUpdate();

        exceptionDesc = "commit";           
        connection.commit();
    } 
    catch (SQLException sqlEx) {
        if (exceptionDesc.equals("prepareStatement")) {
            LOG.error ...
        } else if (exceptionDesc.equals("executeQuery")) {
            LOG.error(" executeQuery ...
                    ...
                    ...
        throw new SQLException(sqlEx);
    } 
4

3 回答 3

5

不要做任何事。异常的堆栈跟踪为您执行此操作:

catch (SQLException e) {
    LOG.error("A SQLException happened", e);
    throw e;
}

足够了。记录器,如果配置为显示堆栈跟踪(它应该这样做),将打印堆栈跟踪,堆栈跟踪将准确地告诉哪个方法,在哪一行,抛出了异常。它还将告诉哪个方法调用了导致异常的方法等,直到堆栈底部。

于 2012-07-22T16:50:12.677 回答
1

1.你应该将try catch从具体的异常对齐到最抽象的异常。

2.但是即使你使用 SQLException,堆栈跟踪也会告诉你以下信息:

-发生异常的方法名称。

-发生异常的类名。

-发生异常的文件名。

-发生异常的行号。

catch (SQLException e) {

       e.printStackTrace();
}
于 2012-07-22T17:20:26.893 回答
0

为什么业务层需要知道如此细粒度的细节?业务逻辑如何取决于您的数据库事务中的哪一行失败?这仅对人类开发人员/维护人员感兴趣。顺便说一句,我什至什么都抓不到——我会让异常向上传播到主要异常屏障,即管理 JDBC 连接的地方。您在每个 DAO 方法中都重复了事务管理,这也不是很好。您应该让您的业务级代码(以及 DAO)只关注每个事务的细节,并将连接和事务管理留给一个中心位置。如果您在项目中使用 Spring(一个非常热情的建议),这将很容易设置。

于 2012-07-22T19:06:12.433 回答