C# Возврат чего-либо из дескриптора исключения

StackOverflow https://stackoverflow.com/questions/800612

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть следующий код в моем классе.Цель этого класса — получить баланс с веб-сервера.На случай, если что-то пойдет не так с получением баланса.Я обработаю исключение.Однако все это легко сделать.Но мне интересно, что я возвращаю в своем операторе catch.

Большинство примеров, которые я рассмотрел, просто записывают в консоль, используя:

Console.WriteLine(ex.Message);

Это все очень хорошо.Но что делает большинство разработчиков в реальном приложении?

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

Моя функция на данный момент возвращает void.И мне просто интересно, что еще мне вернуть, если веб-клиент занят?

Большое спасибо за любой совет,

Это было полезно?

Решение

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

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

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

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Обратите внимание, что это throw; и не throw exception;.Если вы сделаете последнее, вы потеряете исходную трассировку стека.Если вы можете получить более подробную информацию о причине исключения, вам следует превратить перехваченное исключение в более значимое исключение с дополнительной информацией.

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Другие советы

Вы должны использовать метод ex.ToString()

Exception.Message содержит простое описание исключения (например,«Ссылка на объект не установлена...»).

Exception.tostring () содержит описание исключения вместе с полной трассировкой стека.

Лучшие практики обработки исключений в .NET

Вы можете повторно запустить метод, если клиент занят, но подождать определенное время перед повторной попыткой?Потенциально с ошибкой после x повторных попыток.

Если вместо этого вы хотите двигаться дальше и просто зарегистрировать проблему, ваш оператор catch может зарегистрировать исключение в файловом журнале, средстве просмотра событий, отправить его в базу данных, выдать предупреждение (по электронной почте, SMS и т. д.), если это необходимо.

Зависит от серьезности исключения.

Я бы предложил изучить Блок исключений из шаблонов и практик

Если вас интересует только просмотр исключения, вам следует его повторно выбросить, чтобы тот, кто планирует его обработать, все равно его получил.

Вы, конечно же, не хотите маскировать необработанное исключение.Пусть это пузырится через стопку.Но если вы спрашиваете, что вернуть, если веб -клиент просто занят, как насчет возвращения либо случайного интервала, либо какого -то значимого интервала, который должен ждать вызывающего функции, прежде чем попытаться снова загрузить баланс?Случайное число может распределить нагрузку или иным образом смягчить проблему коллизий.Более значимый интервал может быть отправлен обратно на основе текущего состояния сервера.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top