当抛出异常时,catch 不起作用

问题描述 投票:0回答:4

不幸的是,我不必控制

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。还有一些我现在无法控制的事情。

java logging exception stack-trace java1.4
4个回答
2
投票

让我提出一个假设。

WebUser.getUserByUserId
包含此代码:

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

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


1
投票

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

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

1
投票

您在抛出 new

Throwable
的超类中捕获异常。


0
投票

你无法控制

getUserByUserId()
;然而,它似乎在同一个包中
com.bcbst.dsmart.api
,所以这个答案假设(以便继续)它不属于您在同一个项目中的责任,但是您有它的源文件

getUserByUserId()
所属类的源代码与运行时使用的编译版本之间是否可能不匹配?

如果

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

请参阅 SO 上的这个答案,了解有关该假设的更多信息。

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

© www.soinside.com 2019 - 2024. All rights reserved.