不幸的是,我无法控制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。我现在无法控制的其他事情。
答案 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。
=>重新编译所有内容,然后重新部署。