2

不幸的是,我无法控制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

4 回答 4

2

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

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

该假设与您提交的所有证据 100% 一致。为了继续你的调查,你必须首先反驳这个假设。

于 2012-11-06T17:03:15.917 回答
1

您在抛出 new 的超类中捕获异常Throwable

于 2012-11-06T16:12:03.070 回答
1

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

catch (Throwable t) {
    // handle here.
}
于 2012-11-06T16:14:45.667 回答
0

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

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

如果throws语句在编译后在该类中进行了修改,或者异常本身已更改,这可以解释您的这种明显荒谬的情况。

有关该假设的更多信息,请参见 SO 上的答案。

=> 重新编译一切,然后重新部署。

于 2012-11-06T17:10:10.790 回答