我无法弄清楚为什么......我有两个例外,但我无法抓住它们。
在lib中我有这段代码会引发两种不同的异常。
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我尝试无法进入任何捕获区块。执行 Login.setActivationFlag 行时,日志中会出现错误(如上所示),但会跳过catch块,就像没有任何内容一样。
我无法弄清楚为什么这种奇怪的行为。我使用这些例外3年没有任何问题...... 这个代码肯定有些让我看不到的东西......
答案 0 :(得分:-1)
您是否捕获了相同类型的DatabaseIOException?如果在具有相同名称的不同命名空间中存在异常,并且通过导入该类自动完成“帮助”,则会得到您描述的行为。
答案 1 :(得分:-1)
经过大约4个小时的调试后,我发现它是什么:处理异常时最糟糕的事情。
在 setActivationFlag()中,返回语句放错位置......它落入 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 语句,永远不会捕获外部异常。