我正在尝试从类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块。我做错了什么?
答案 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)
按顺序检查以下内容:
insertUserData()
根本没有抛出异常,请验证它是否应该抛出异常。看起来你期待的东西永远不会到来。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");
}