Почему выполнение кода никогда не входит в блок catch (java)? - PullRequest
1 голос
/ 05 мая 2009

Я пытаюсь сгенерировать (специальное) ImportException из метода importUsers в классе UserHelper. Я вижу в отладчике, что предложение throw выполняется, но метод, из которого вызывается метод importUsers, никогда не перехватывает исключение.

Вот метод, где выбрасывается исключение:

public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException {

    //(irrelevant code removed)

    try {
        isSuccess = insertUserData(st, blocks, db, actor);
    } catch (Exception e) {
        throw new ImportException("Could not insert user on line " + rowCounter);
    }

}

Здесь я безуспешно пытаюсь поймать выброшенное исключение из метода execute в классе AccessorValidator:

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    //(irrelevant code removed)
    try{
        av = UserHelper.importUsers(data, admin);
        System.out.print("test2");
    } catch (ImportException ie) {
        System.out.print("testE");
        returnMessageValue = ie.getMessage();
    } catch (Exception e) {
        System.out.print("testE2");
    }

Вывод «test2», и выполнение кода никогда не попадает ни в один из блоков catch. Что я делаю не так?

Ответы [ 8 ]

5 голосов
/ 05 мая 2009

попробуйте изменить свой метод на

try {
    isSuccess = insertUserData(st, blocks, db, actor);
    system.out.print("after insertUserData");
} catch (Exception e) {
    System.out.print("before throwing");
    throw new ImportException("Could not insert user on line " + rowCounter);
}

, чтобы вы могли убедиться, что то, что вы видите в отладке, является тем, что фактически выполняется (проверяя вашу консоль), и указывает, действительно ли insertUserData выдает исключение.

1 голос
/ 05 мая 2009

Если напечатано «test2», то importUsers () вообще не создает исключений.

Информация о строке в отладчике может быть неточной. Попробуйте установить точку останова в конструкторе исключения, чтобы увидеть, действительно ли оно создается.

0 голосов
/ 05 мая 2009

Проблема решена. Похоже, что блок try-catch в методе importUsers был окружен другим блоком try-catch, который не генерировал исключение ImportException. Итак, первый блок catch работал правильно, я просто пропустил второй.

0 голосов
/ 05 мая 2009

попытаться поймать Throwable, корень исключений и ошибок, с помощью:

try{
        av = UserHelper.importUsers(data, admin);
        System.out.print("test2");
    } catch (ImportException ie) {
        System.out.print("testE");
        returnMessageValue = ie.getMessage();
    } catch (Exception e) {
        System.out.print("testE2");
    } catch (Throwable t) {
        // Here you'll catch *anything* else
        System.out.print("testTE");
    }
0 голосов
/ 05 мая 2009

Если вывод «test2», то определенно исключение не было выдано.

Просто угадай ...

Иногда ваша IDE может не синхронизироваться с исходным кодом, который фактически выполняется, особенно если ваш код является частью внешней библиотеки ... Если вы измените код библиотеки и не обновите фактический classpath, или если это изменение произойдет во время отладки, строки кода могут измениться, и вы можете увидеть исключение, которое выдается, хотя на самом деле этого не происходит.

0 голосов
/ 05 мая 2009

Проверьте следующее по порядку:

  1. проверьте, что ваши точки останова синхронизированы с исходным кодом
  2. insertUserData() вообще не вызывает исключение, проверьте, должно ли оно вообще вызывать исключение или нет. Похоже, вы ожидаете чего-то, что никогда не придет.
  3. Убедитесь, что ImportException действительно один и тот же объект, в обоих случаях вы ссылаетесь на него
0 голосов
/ 05 мая 2009

Вы уверены, что insertUserData на самом деле выдает исключение, а не только возвращает истинное / ложное логическое значение? Видение шага отладчика в строке с «throw» не означает, что что-то выброшено, так как информация о строке не всегда полностью точна.

0 голосов
/ 05 мая 2009

возможно, insertUserData () не вызывает каких-либо исключений в вашей тестовой настройке? Было бы полезно, если бы этот метод был включен в ваш вопрос ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...