Что правильно делать, если socketChannel.close() получил IOException?

У меня есть класс, который обертывает socketChannel и имеет метод close() следующим образом:

public void close() {
    // ... logic ...
    try {
        socketChannel.close();
    } catch (IOException e) {
          // ???
    }
    this.isConnected = false;
}

Я хочу, чтобы в конце этой операции socketChannel был закрыт и не зарегистрирован в его селекторе. Я прочитал и обнаружил, что приведенного выше кода достаточно для этого, но что произойдет, если я получу IOException?

Мне кажется, что достаточно «проглотить», но я что-то упускаю?


person slashms    schedule 16.11.2016    source источник
comment
Вы можете поместить isConnected = false; в предложение finally.   -  person Klitos Kyriacou    schedule 16.11.2016
comment
Вы абсолютно правы, спасибо.   -  person slashms    schedule 16.11.2016


Ответы (1)


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

Сценарий №1.

Веб-сервер получает исключение при закрытии выходного потока, на который он отправил ответ. Типичной причиной является то, что пользователь закрыл свой веб-браузер или потерял сетевое соединение в неподходящий момент. Исключение на стороне сервера не имеет значения (для администратора сервера/сервера) и даже не стоит регистрировать.

Сценарий №2.

Вы делаете что-то, что включает в себя общение с несколькими серверами, и важно знать, что все они «получили сообщение». Если при закрытии возникает исключение, это может указывать на то, что этого не произошло. Вероятно, вам нужно записать это. Возможно, вам нужно сообщить серверам. Возможно, вам нужно вызвать откат какой-либо вложенной транзакции.

person Stephen C    schedule 16.11.2016