抛出异常但未捕获

时间:2013-04-26 11:36:39

标签: java exception-handling

我无法弄清楚为什么......我有两个例外,但我无法抓住它们。

在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年没有任何问题...... 这个代码肯定有些让我看不到的东西......

2 个答案:

答案 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 语句,永远不会捕获外部异常。

相关问题