У меня есть следующий код:
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, рубль
Это не создает исключение 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.
}
}
Вы абсолютно не должны различать на основе сообщения. Это рецепт проблем с переносимостью. Сообщение является чувствительной темой для изменений, которые могут даже зависеть от локали!
Существуют различные тонкие (или в некоторых случаях несложные) способы генерировать проверенные исключения в ситуациях, когда они не объявлены явно. Некоторые из них перечислены на этой странице .
Просто подумайте, может ли это быть UnknownHostException
в другом пакете?
e.getMessage () выдает вывод, указывающий на то, что где-то происходит исключение UnknownHostException, но, возможно, это код порта.login () где-то перехватывает UnknownHostException, генерирует другое исключение и заявляет в сообщении этого исключения, что UnknownHostException было исходным исключением (или, возможно, связывало его). Трудно сказать, не зная, какой именно тип исключения попадает в исходный блок catch. Сначала выясните это (возможно, просто выполнив e.printStackTrace ()), и это должно сказать вам, что вы должны уловить.