2011-12-20 3 views
0

Я создаю функцию, которая будет принимать сокет и возвращать 3 знака 0 = действительно плохая ошибка произойдет выходная нить 1 = нормально поговорить с соединением = что-то случилось, сделайте еще один прием (тайм-аут).Если сокет принимает причину исключения, как я могу узнать причину?

Я вижу, что в IOException есть методы GetCause, которые возвращают бросающийся объект. Этот металитируемый объект имеет метод get cause, который возвращает throwable, который имеет метод getcuase, возвращающий бросающийся, похоже, что это будет продолжаться вечно, продолжайте получать другой объект, который может быть взлетающим.

Как я могу получить причину исключения ant off ????? Я мог бы использовать причину, и сравнивает последовательность строк, но это не кажется надежным. Тед

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; 
} 

ответ

0

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

1
accept() 

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

Это покрывает ваши 3 случая, хорошо, IOException и тайм-аут?

Смежные вопросы