Если прием через сокет вызывает исключение, как я могу узнать причину? - PullRequest
0 голосов
/ 20 декабря 2011

Я создаю функцию, которая будет принимать и возвращать сокет 3 значения 0 = действительно произошла очень плохая ошибка, выходной поток 1 = нормально говорить с соединением = что-то произошло, сделать другое подтверждение (время ожидания).1002 * Я вижу, что IOException имеет метод GetCause, который возвращает бросаемый объект.у этого бросаемого объекта есть метод get, который возвращает метод throwable, в котором есть метод getcuase, возвращающий throwable, похоже, что это будет продолжаться вечно, продолжая получать другой объект throwable.муравейЯ мог бы использовать метод get и сравнение строк, но это не кажется надежным.Тед

int GetClient()
{
    try {
        server.setSoTimeout(5*1);  
        connection=server.accept();
    }
    catch(IOException ec)
    {
        System.out.println(Thread.currentThread()+":"+ec.getMessage()); 


        return 2; // for time out or something where we can try again
        // return a zero saying we must stop erra o bad

    }   
    return 1;
}

Ответы [ 2 ]

1 голос
/ 20 декабря 2011
accept()

выдает множество исключений. SocketTimeoutException расширяет IOException, но вы можете «поймать» его, прежде чем перехватывать общее IOException. Это позволит вам вернуть значение, предлагающее повторить попытку.

Охватывает ли это ваши 3 случая, ОК, IOException и Timeout?

0 голосов
/ 20 декабря 2011

Если вас интересуют только исключения тайм-аута, поймайте эти исключения отдельно. Большинство методов ввода-вывода потенциально могут генерировать 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 включает строку, которую пытался проанализировать).

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