为什么代码执行永远不会进入catch块(java)?

时间:2009-05-05 08:38:43

标签: java exception exception-handling

我正在尝试从类UserHelper中的方法importUsers抛出(自定义)ImportException。我可以在调试器中看到执行了throw子句,但调用importUsers方法的方法从不捕获异常。

以下是抛出异常的方法:

public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException {

    //(irrelevant code removed)

    try {
        isSuccess = insertUserData(st, blocks, db, actor);
    } catch (Exception e) {
        throw new ImportException("Could not insert user on line " + rowCounter);
    }

}

这里我尝试从AccessorValidator类中的execute方法中捕获抛出的异常失败:

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    //(irrelevant code removed)
    try{
        av = UserHelper.importUsers(data, admin);
        System.out.print("test2");
    } catch (ImportException ie) {
        System.out.print("testE");
        returnMessageValue = ie.getMessage();
    } catch (Exception e) {
        System.out.print("testE2");
    }

输出为“test2”,代码执行永远不会到达任何一个catch块。我做错了什么?

8 个答案:

答案 0 :(得分:5)

尝试将您的方法更改为

try {
    isSuccess = insertUserData(st, blocks, db, actor);
    system.out.print("after insertUserData");
} catch (Exception e) {
    System.out.print("before throwing");
    throw new ImportException("Could not insert user on line " + rowCounter);
}

这样你就可以确保你在debug中看到的是实际执行的内容(通过检查你的控制台),以及insertUserData是否实际抛出异常。

答案 1 :(得分:1)

如果打印了“test2”,那么importUsers()根本不会抛出任何异常。

调试器中的行信息可能不准确。尝试在Exception的构造函数中放置一个断点,看看它是否真的被创建了。

答案 2 :(得分:0)

也许insertUserData()不会在您的测试设置中抛出任何异常?如果这个方法也包含在你的问题中会有所帮助......

答案 3 :(得分:0)

你确定insertUserData实际上抛出异常,而不仅仅返回一个真/假布尔值吗?将调试器步骤看作带有“throw”的行并不意味着抛出某些东西,因为行信息并不总是完全准确。

答案 4 :(得分:0)

按顺序检查以下内容:

  1. 检查断点是否与源代码同步
  2. insertUserData()根本没有抛出异常,请验证它是否应该抛出异常。看起来你期待的东西永远不会到来。
  3. 检查ImportException在您引用它的两种情况下确实是同一个对象

答案 5 :(得分:0)

如果输出为“test2”,则肯定,不会抛出异常。

猜猜......

有时您的IDE可能无法与实际执行的源代码同步,特别是如果您的代码是外部库的一部分...如果更改库的代码而不更新实际的classpath或者如果在调试时发生了这种变化,代码行可能会改变,你可能会看到抛出异常,尽管这种情况并没有发生。

答案 6 :(得分:0)

问题解决了。方法importUsers中的try-catch块似乎被另一个try-catch块包围,该块没有抛出ImportException。所以第一个阻塞工作正常,我只是错过了第二个。

答案 7 :(得分:-1)

尝试使用:

捕获Throwable,Exception和Error的根源
try{
        av = UserHelper.importUsers(data, admin);
        System.out.print("test2");
    } catch (ImportException ie) {
        System.out.print("testE");
        returnMessageValue = ie.getMessage();
    } catch (Exception e) {
        System.out.print("testE2");
    } catch (Throwable t) {
        // Here you'll catch *anything* else
        System.out.print("testTE");
    }