У меня есть интерфейс, который называется 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-соединения в один тип?
Я использую перечисление, содержащее значения для всех возможных ошибок?
Есть ли у меня простой код ошибки и описание ошибки?
И сколько из многих многих условий ошибки сокета я должен обрабатывать? Только те, с которыми я встречаюсь? Или все?
Я рассмотрел это, но я чувствую, что это заставляет код пользователя знать все базовые типы подключений, поэтому каждый раз, когда добавляется новый тип подключения, код пользователя должен быть реорганизован. Кроме того, знаете ли вы о каком-либо производственном коде, который делает что-то вроде этого? Что-нибудь в платформе .NET? Мне нравится следовать лучшим практикам. – NoPyGod
«Код пользователя» не должен заботиться о типе ошибки. Все, что ему нужно знать, это то, что произошла некоторая ошибка, а затем сообщить об этом пользователю. –
Но если каждый тип исключения (SocketException, HttpConnectionException) содержит определенную информацию, то на земле пользователя это исключение необходимо будет отнести к различным типам исключений, а затем просмотреть более подробную информацию для представления пользователю. Единственный другой способ - представить его пользователю, вызвав ToString() для исключения, и, насколько я понимаю, этот метод должен использоваться программистом и не показан пользователю. – NoPyGod