2013-02-08 3 views
1

У меня есть интерфейс, который называется IConnectionабстрагирования ошибки подключения

public interface IConnection 
{ 

    bool IsConnected { get; } 
    Task ConnectAsync(IEndPoint remoteEP); 
    Task<int> SendAsync(byte[] data, int offset, int size); 
    Task<int> ReceiveAsync(byte[] buffer, int offset, int size); 
    void Disconnect(); 
    void Close(); 

    event EventHandler<DisconnectedEventArgs> Disconnected; 

} 

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

При запуске подключения в моем основном классе ChatClient я проверю конфигурацию пользователя, а затем, в зависимости от того, что пользователь предпочитает, создаст SocketConnection или HTTPConnection. С этого момента я ссылаюсь только на соединение, используя его интерфейс IConnection.

Класс IConnection имеет событие Disconnected, которое возникает, когда пользователь вызывает Disconnect или когда возникает некоторая неожиданная ошибка соединения. DisconnectedEventArgs будет содержать информацию о том, что привело к отключению.

Что мне интересно, как мне абстрагироваться от разных типов ошибок?

Сокет может испытать много различных условий ошибок, которые могли бы привести его отключить, в том числе, но не ограничиваясь ими -

  • удаленной стороны инициировала изящное разъединение (т.е. .. Read возвращает 0)
  • для чтения/записи бросает SocketException с флагом SocketError.ConnectionAborted
  • для чтения/записи бросает SocketException с флагом SocketError.NetworkReset

НТТР гр onnection может также испытать много различных условий ошибок, например -

  • неспособность опрашивать удаленный сервер - например .. хозяин внезапно исчезает
  • учетные данные аутентификации HTTP отвергаются

Как я объединить все возможные ошибки для сокета и все возможные ошибки для http-соединения в один тип?

Я использую перечисление, содержащее значения для всех возможных ошибок?

Есть ли у меня простой код ошибки и описание ошибки?

И сколько из многих многих условий ошибки сокета я должен обрабатывать? Только те, с которыми я встречаюсь? Или все?

ответ

1

Почему нет DisconnectEventArgs содержит public Exception Error { get; set; }. Error имеет значение null, когда Disconnect вызывается обычно, в противном случае он содержит исключение Socket или Http.

+0

Я рассмотрел это, но я чувствую, что это заставляет код пользователя знать все базовые типы подключений, поэтому каждый раз, когда добавляется новый тип подключения, код пользователя должен быть реорганизован. Кроме того, знаете ли вы о каком-либо производственном коде, который делает что-то вроде этого? Что-нибудь в платформе .NET? Мне нравится следовать лучшим практикам. – NoPyGod

+0

«Код пользователя» не должен заботиться о типе ошибки. Все, что ему нужно знать, это то, что произошла некоторая ошибка, а затем сообщить об этом пользователю. –

+0

Но если каждый тип исключения (SocketException, HttpConnectionException) содержит определенную информацию, то на земле пользователя это исключение необходимо будет отнести к различным типам исключений, а затем просмотреть более подробную информацию для представления пользователю. Единственный другой способ - представить его пользователю, вызвав ToString() для исключения, и, насколько я понимаю, этот метод должен использоваться программистом и не показан пользователю. – NoPyGod

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