У меня есть клиентский класс, который подключается к серверу через WebRequest
.Сейчас я борюсь с тем, как лучше всего реализовать обработку WebException
.Для получения хорошего отзыва о пользовательском интерфейсе мне нужно (пока) сообщение об исключении и статус.
Я предложил три разных подхода.Первый просто перебрасывает исключение, и я выполняю обработку в вызывающем методе.Это может быть наиболее универсальным решением:
public class ClientSimpleRethrow
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException)
{
IsConnected = false;
throw;
}
IsConnected = true;
}
}
Вторая версия выдает пользовательское исключение с WebException
в качестве внутреннего исключения.Это дает мне преимущество только ловить и обрабатывать именно то, что я ожидаю.Например, может быть другая ошибка, которая также выдает WebException
, которую я хотел бы обработать по-другому.Пока что это мое любимое решение:
public class ClientThrowCustom
{
public bool IsConnected { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException ex)
{
IsConnected = false;
throw new ClientConnectionException(ex.Message, ex);
}
IsConnected = true;
}
}
Я бы мог подумать и о третьей возможности.Исключение перехватывается, и я устанавливаю только те свойства, которые мне действительно нужны для обработки исключения в пользовательском интерфейсе.Информация о том, что что-то пошло не так, у меня уже есть в свойстве IsConnected
.Преимущество этого решения состоит в том, что вы не поймаете дважды.
public class ClientProperties
{
public bool IsConnected { get; set; }
public string ConnectionErrorMessage { get; set; }
public WebExceptionStatus? ConnectionErrorStatus { get; set; }
public void Connect()
{
try
{
// do connection
}
catch (WebException ex)
{
IsConnected = false;
ConnectionErrorMessage = ex.Message;
ConnectionErrorStatus = ex.Status;
return;
}
IsConnected = true;
ConnectionErrorMessage = null;
ConnectionErrorStatus = null;
}
}
Мне понадобится совет по передовой практике, какой из них выбрать и почему.Я надеюсь, что этот вопрос не слишком субъективен, потому что я действительно думаю, что должны быть некоторые веские факты, чтобы выбрать один дизайн из других.
Заранее спасибо за вашу помощь!