У меня многопоточная операция, которая выполняет ряд задач. Проблема, с которой я сталкиваюсь, - это веб-сервис, который может вернуть тайм-аут при сильном стрессе.
Когда при сильном напряжении (Тайм-аут), я хочу, чтобы функция повторила
Try
{
// Do some actions here
}
catch(WebException ex)
{
if (// Timeout)
{ //Retry }
else
{ // return error }
}
catch(Exception ex)
{ //return error }
От MSDN. Webexception может возникать в следующих ситуациях:
Вопрос: В моей обработке исключений, как можно разделить эти 3 причины и выделить TimeoutExceptions
без использования сообщения?
Примечание. Я знаю, что могу просто увеличить timeout
чтобы решить проблему. Но это не ставит в известность мое любопытство.
Спасибо за ваше время
Вы можете проверить свойство Status по сравнению с одним из кодов статуса веб-запроса:
try {
}
catch(WebException ex) {
if (ex.Status == WebExceptionStatus.Timeout) {
// Retry logic
}
else {
// return error
}
}
См. Также этот пост для примера логики повтора. Обратите внимание, что Timeout
- не единственная причина, которая должна вызвать повторную попытку (IMO также ConnectionFailure
и ConnectionClosed
, по крайней мере).
Вы можете посмотреть свойство Status Exception, которое будет содержать правильную причину исключения.
Поскольку вы используете какое-то время, связанное с поведением, если вы используете некоторые тесты в своем коде, я бы рекомендовал взглянуть на Reactive extensions; он позволяет настраивать цепочки событий, которые могут позволить вам легко тестировать желаемое поведение. Посмотрите на этот вопрос для примера, где я хотел, чтобы некоторые события повторялись, - это более высокая частота в случае ошибки, которая может вас заинтересовать.
Reactive Extensions