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

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

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

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. И мне просто интересно, что еще я бы вернул, если веб-клиент занят?

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

Ответы [ 6 ]

14 голосов
/ 29 апреля 2009

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

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

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

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;
}
3 голосов
/ 29 апреля 2009

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

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

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

Рекомендации по обработке исключений в .NET

1 голос
/ 29 апреля 2009

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

1 голос
/ 29 апреля 2009

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

1 голос
/ 29 апреля 2009

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

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

1 голос
/ 29 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...