1

我不知道为什么......我抛出了 2 个异常,但我无法捕捉到它们。

在一个库中,我有这段代码会引发 2 种不同的异常。

try {
    statement = con.prepareStatement(query);
    if (statement.executeUpdate() != 1) {
        throw new InvalidIndexException("Record not found or not modified", query);
    }
} catch (SQLException e) {
    throw new DatabaseIOException(e, "", "SQL Error", logQuery);
}

修改查询以触发 SQL 错误。当它发生时,我有一个日志条目:

2013-04-26 12:19:39 class database.DatabaseIOException
userManagement.Login.setActivationFlag(Login.java:473) 
-> SQL Error
[QUERY]: UPDATE login SET activationprTTTTocess='false' WHERE  id=235423432
[MSG]: ERROR: column "activationprttttocess" of relation "login" does not exis

所以我确定 sqlerror 已被捕获并重新抛出为DatabaseIOException,我也使用 Netbeans 在调试模式下跟踪代码执行。现在一切正常。

现在我有一个 servlet,我尝试在其中激活用户:

try{
   Login.setActivationFlag(235423432, false);
} catch (DatabaseIOException db) {
   Log.addItem(db.getMessage());
} catch (InvalidIndexException ed){
   Log.addItem(ed.getMessage());
}

Wathewer 我尝试没有办法进入任何 catch 块。执行Login.setActivationFlag行时,错误会出现在日志中(如上所示),但会跳过 catch 块,就像没有附加任何内容一样。

我无法弄清楚为什么会出现这种奇怪的行为。自 3 年以来,我一直在使用这些异常,没有任何问题......这段代码一定有一些非常愚蠢的东西,我看不到......

4

2 回答 2

-1

您是否捕获了相同类型的 DatabaseIOException?如果在具有相同名称的不同命名空间中存在异常,并且通过导入该类自动完成“帮助”,您将获得您描述的行为。

于 2013-04-26T11:41:06.587 回答
-1

经过大约 4 个小时的调试,我发现了它是什么:处理异常时最糟糕的事情。

setActivationFlag()中,return语句放错了位置……它落在了finally 块中。

...
   } finally {
      ...
      return done;
   }
}

代替

...
   } finally {
       ...
   }
   return done;
}

编辑:这里有一段代码要测试

public void ExceptionTest() throws Exception {
    try {
        Integer test = null;
        test.toString();
    } catch (NullPointerException e) {
        out.println("Catched inner NullPointerException");
            throw new Exception("My Exception", e);
    } finally {
        return;
    }
}

public void test() {
    try {
        ExceptionTest();
    } catch (Exception outer) {
        out.println("Catched: " + outer.getMessage());
    }
}

使用finally块中的return语句,永远不会捕获外部异常。

于 2013-04-26T12:17:40.857 回答