Java не перехватывает исключение

К сожалению, я не могу контролировать 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 ответа

Решение

Позвольте мне предложить гипотезу. WebUser.getUserByUserId содержит этот код:

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

Эта гипотеза на 100% согласуется со всеми представленными вами доказательствами. Чтобы продвинуться вперед в своем расследовании, вы должны сначала опровергнуть эту гипотезу.

Вы ловите исключение в суперклассе, где вы бросаете новый Throwable,

Я согласен с другим ответом, что это очень плохая практика - использовать исключения для управления потоком данных, но чтобы действительно ответить на ваш вопрос, вы пытались поймать Throwable вместо Exception?

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

Вы не можете контролировать getUserByUserId(); Тем не менее, кажется, что в том же пакете com.bcbst.dsmart.api, так что этот ответ предполагает (чтобы двигаться дальше), он находится вне вашей ответственности в рамках того же проекта, но у вас есть его исходные файлы.

Может ли быть несоответствие между источниками класса getUserByUserId() принадлежит, а скомпилированная версия, которая используется во время выполнения?

Если throws операторы были изменены в этом классе после того, как они были скомпилированы, или были изменены сами исключения, это может объяснить вашу кажущуюся абсурдной вашу ситуацию.

Смотрите этот ответ на SO для получения дополнительной информации об этой гипотезе.

=> Перекомпилируй все и заново разверни.

Другие вопросы по тегам