в компиляторе Java говорится, что это исключение никогда не выдается в теле соответствующего оператора попытки - но он брошенный _is_

У меня есть следующий код:

try {
    //jaw-ws service port operation
    port.login();
} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getMessage());
}

Когда вышеупомянутое выполняется с неправильным именем хоста, я добираюсь:

Caught Exception in login(): HTTP transport error: java.net.UnknownHostException: abc

Это корректно и ожидается. Я переписал код для специфической ловли UnknownHostException, следующим образом:

import java.net.UnknownHostException;
try {
    //jaw-ws service port operation
    port.login();
} catch (UnknownHostException uhe) {
    //do something specific to unknown host exception
} catch (Exception e) {
    logger.error(Caught Exception in login(): " + e.getMessage());
}

Однако, когда я пытаюсь скомпилировать это, я добираюсь:

[javac] foo.java: exception java.net.UnknownHostException is never thrown in body of corresponding try statement
[javac]         } catch (UnknownHostException uhe) {
[javac]                  ^

Это - ясно ложь, так как исключение выдается, поскольку я поймал его прежде. Что я пропускаю здесь?

tia, рубль

16
задан Joachim Sauer 26 July 2010 в 13:36
поделиться

4 ответа

Это не создает исключение UnknownHostException . Оно просто появляется в сообщении исключения, которое вы действительно перехватили. Вероятно, это основная причина обнаруженного вами исключения.

Чтобы определить фактическое исключение , вы должны распечатать более подробную информацию. Например.

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getClass().getName() + ": " + e.getMessage());
}

или просто используя Throwable # toString () , который уже включает как тип исключения, так и сообщение:

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e);
}

, или просто передайте исключение в качестве второго аргумента регистратора, если он правильно настроен, его трассировка стека будет напечатана:

} catch (Exception e) {
    logger.error("Caught Exception in login(): " + e.getMessage(), e);
}

​​Обновите в соответствии с вашими комментариями: лучше всего обновить улов следующим образом:

} catch (ClientTransportException e) {
    if (e.getCause() instanceof UnknownHostException) {
        // UHE.
    } else {
        // Other.
    }
}

Вы абсолютно не должны различать на основе сообщения. Это рецепт проблем с переносимостью. Сообщение является чувствительной темой для изменений, которые могут даже зависеть от локали!

16
ответ дан 30 November 2019 в 22:37
поделиться

Существуют различные тонкие (или в некоторых случаях несложные) способы генерировать проверенные исключения в ситуациях, когда они не объявлены явно. Некоторые из них перечислены на этой странице .

1
ответ дан 30 November 2019 в 22:37
поделиться

Просто подумайте, может ли это быть UnknownHostException в другом пакете?

0
ответ дан 30 November 2019 в 22:37
поделиться

e.getMessage () выдает вывод, указывающий на то, что где-то происходит исключение UnknownHostException, но, возможно, это код порта.login () где-то перехватывает UnknownHostException, генерирует другое исключение и заявляет в сообщении этого исключения, что UnknownHostException было исходным исключением (или, возможно, связывало его). Трудно сказать, не зная, какой именно тип исключения попадает в исходный блок catch. Сначала выясните это (возможно, просто выполнив e.printStackTrace ()), и это должно сказать вам, что вы должны уловить.

0
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: