Java没有捕获异常

时间:2012-11-06 16:01:14

标签: java logging exception-handling stack-trace java1.4

不幸的是,我无法控制getUserByUserId(String)。它的行为方式是如果找到用户则返回用户,如果没有找到用户则抛出OntNoObjectExistsException。我的问题是,由于某些原因,当它被抛出时,捕获并不会捕获OntNoObjectExistsException

此例外的类型层次结构为:OntNoObjectExistsException - > OntException - > Exception - > Throwable

public boolean isUserIdAvailable(String userId) {
    try {
        return super.getUserByUserId(userId) == null;
    } catch (OntNoObjectExistsException e){
        return true;
    } catch (Exception ex) {
        appLog.error(ex.getMessage());
    }
    return false;
}

我尝试使用此代码来测试水域并且问题仍然存在。请注意,我正在捕捉Throwable

public boolean isUserIdAvailable(String userId) {
    try {
        return super.getUserByUserId(userId) == null;
    } catch (Throwable ex) {
        appLog.error(ex.getMessage());
    }
    return false;
}

这是堆栈跟踪:

com.opennetwork.exception.OntNoObjectExistsException: User not found
    at com.bcbst.dsmart.api.WebUser.getUserByUserId(WebUser.java:411)
    at com.bcbst.dsmart.api.WebProspectiveMemberBean.isUserIdAvailable(WebProspectiveMemberBean.java:71)
    at com.bcbst.dsmart.api.EJSLocalStatelessWebProspectiveMember_ce00ef7b.isUserIdAvailable(EJSLocalStatelessWebProspectiveMember_ce00ef7b.java:120)
    at com.bcbst.prospectivememberweb.actions.UsageagreementAction.execute(UsageagreementAction.java:61)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

另请注意,这是java 1.4。我现在无法控制的其他事情。

4 个答案:

答案 0 :(得分:2)

让我提出一个假设。 WebUser.getUserByUserId包含以下代码:

if (userNotFoundCondition) {
  OntNoObjectExistsException e = new OntNoObjectExistsException("User not found");
  logger.error("User not found", e);
  throw e;
}

此假设与您提交的所有证据100%一致。为了推进调查,您必须首先反驳这一假设。

答案 1 :(得分:1)

您正在引发新Throwable的超类中捕获异常。

答案 2 :(得分:1)

我同意另一个答案,即使用流量控制的异常是非常糟糕的做法,但实际上回答你的问题你是否试图捕获Throwable而不是Exception?

catch (Throwable t) {
    // handle here.
}

答案 3 :(得分:0)

您无法控制getUserByUserId();但是,它似乎在同一个包com.bcbst.dsmart.api中,所以这个答案假设(以便继续)它在同一个项目中不在你的责任之内,但是你有其源文件

getUserByUserId()所属的源与运行时使用的编译版本之间是否存在不匹配?

如果throws语句在编译后已在该类中被修改,或者例外本身已被更改,这可以解释这种情况显然是荒谬的。

有关该假设的更多信息,请参阅SO上的this answer

=>重新编译所有内容,然后重新部署。