【问题标题】:Why does the code execution never enter the catch block (java)?为什么代码执行从不进入catch块(java)?
【发布时间】:2009-05-05 08:38:43
【问题描述】:

我正在尝试从 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 类的执行方法中捕获抛出的异常,但没有成功:

    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 块。我做错了什么?

【问题讨论】:

  • UserHelper.importUsers(data, admin);没有比抛出异常!

标签: java exception exception-handling


【解决方案1】:

尝试将您的方法更改为

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);
}

这样您就可以确保您在调试中看到的是实际执行的内容(通过检查您的控制台),以及 insertUserData 是否实际引发异常。

【讨论】:

  • 谢谢,这让我找到了解决方案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 确实如此。我提到“我可以在调试器中看到 throw 子句被执行”;更具体地说,我在调试器中看到在线代码 throw new ImportException("Could not insert user on line" + rowCounter);被执行。
    • insertUserData方法的代码我没有添加,因为实际的异常抛出了好几层,后面会比较复杂。
    【解决方案4】:

    您确定insertUserData 实际上会引发异常,并且不仅返回真/假布尔值吗?看到调试器步骤到带有“抛出”的行并不意味着抛出了某些东西,因为行信息并不总是完全准确的。

    【讨论】:

      【解决方案5】:

      按顺序检查以下内容:

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

      【讨论】:

        【解决方案6】:

        如果输出是“test2”,那么肯定没有抛出异常。

        只是猜测......

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            尝试捕获 Throwable,即异常和错误的根源,使用:

            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");
                }
            

            【讨论】:

            • 通常你应该只捕获与你所处的级别相关的异常,所以要对长长的捕获链感到厌烦。话虽这么说,有时这种情况会被强加给我们......
            猜你喜欢
            • 2015-08-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-30
            • 2014-12-15
            • 2021-06-18
            相关资源
            最近更新 更多