不幸的是,我不必控制
getUserByUserId(String)
。 它的行为方式是,如果找到用户,则返回 User
;如果未找到用户,则抛出 OntNoObjectExistsException
。 我的问题是,由于某种原因,当 catch
被抛出时,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。还有一些我现在无法控制的事情。
让我提出一个假设。
WebUser.getUserByUserId
包含此代码:
if (userNotFoundCondition) {
OntNoObjectExistsException e = new OntNoObjectExistsException("User not found");
logger.error("User not found", e);
throw e;
}
这个假设与您提交的所有证据100%一致。为了推进你的调查,你必须首先反驳这个假设。
我同意另一个答案,即使用异常进行流量控制是非常糟糕的做法,但要真正回答你的问题,你是否尝试捕获 Throwable 而不是 Exception?
catch (Throwable t) {
// handle here.
}
您在抛出 new
Throwable
的超类中捕获异常。
你无法控制
getUserByUserId()
;然而,它似乎在同一个包中com.bcbst.dsmart.api
,所以这个答案假设(以便继续)它不属于您在同一个项目中的责任,但是您有它的源文件。
getUserByUserId()
所属类的源代码与运行时使用的编译版本之间是否可能不匹配?
如果
throws
语句在编译后在该类中被修改,或者异常本身已被更改,这可以解释你这种明显荒谬的情况。
请参阅 SO 上的这个答案,了解有关该假设的更多信息。
=> 重新编译所有内容,然后重新部署。