Если вас интересуют только исключения тайм-аута, поймайте эти исключения отдельно. Большинство методов ввода-вывода потенциально могут генерировать IOException, но есть много различных подклассов IOException (которые сами имеют дополнительные подклассы), которые вы можете перехватывать и обрабатывать отдельно.
например.
try {
conn = server.accept();
} catch (SocketTimeoutException e) {
return 2;
} catch (IOException e) {
// socket exception will not be recaught
// even if return statement wasn't used
return 0;
}
return 1;
Метод getCause предоставляется в том случае, если при создании исключений их можно создавать с помощью строкового сообщения, а также исключения, которое могло вызвать появление этого исключения. Таким образом, уловители исключения могут увидеть все детали того, что вызвало исключение.
например.
public double addNumbers(String a, String b) {
try {
double i = Double.parseDouble(a);
double j = Double.parseDouble(b);
return i + j;
} catch (NullPointerException cause) {
throw new IllegalArgumentException(
"Arguments aren't allowed to be null", cause);
} catch (NumberFormatException cause) {
throw new IllegalArgumentException(
"One or more arguments weren't numbers", cause);
}
}
Вышеприведенный случай немного тупой, но он демонстрирует принцип, что может быть поймано какое-то исключение (которое, возможно, может попытаться быть восстановленным), а затем выдается новое исключение с исходным исключением как причиной. Наличие метода getCause
позволяет вызывающей стороне сразу увидеть, что IllegalArgumentException изначально было выброшено в методе addNumbers
(и именно в этом заключается проблема в базе кода пользователя). Однако, посмотрев на причину, они смогут увидеть более подробное сообщение о том, что аргумент недопустим (NumberFormatException
включает строку, которую пытался проанализировать).